算法(7)-leetcode-explore-learn-数据结构-数组-小结
leetcode-explore-learn-數據結構-數組5-小結
- 1.概述
- 2.例題
- 2.1旋轉數組
- 2.2 楊輝三角2
- 2.3翻轉字符串里的單詞
- 2.4反轉字符串中的單詞3
- 2.5 刪除排序數組中的重復項
- 2.6 移動零
本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/
所有例題的編程語言為python
1.概述
1.數組的常用排序算法及其時間復雜度分析十分重要
2.二分查找是一種十分重要的技術,用于在排序數組中搜索特i定元素
3.靈活應用雙指針技巧十分重要,雙指針技可以應用于:鏈表中快慢指針問題,滑動窗口問題
2.例題
2.1旋轉數組
給定一個數組,將數組中的元素向右移動K個位置,其中k為非負數。
空間復雜度:o(1)
思路1:三次求逆:先整體求逆,然后nums[0,k]求逆,然后再nums[k+1:]求逆
思路2:計算每個數組移動到的目標位置,將目標位置的信息記錄下來作為下一個操作的對象(30/35)—[-1,-100,3,99]2測試用例沒過.
class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)action=0index=0current_val=nums[0]while(action<=n):target_index=(index+k)%ntarget_val=nums[target_index]nums[target_index]=current_valaction+=1index=target_indexcurrent_val=target_valreturn nums修正思路:環裝替換法
參考官網解題思路:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
思路3,暴力法,每次移動一個,移動k次
(34/35)時間超出限制
2.2 楊輝三角2
返回楊輝三角的第k行,算法空間復雜度,o(k)
思路1:計算整個楊輝三角,返回最后一行
class Solution(object):def getRow(self, rowIndex):res=[]for i in range(rowIndex+1): # i:[0,rowIndex] rowIndex+1行if i==0:res.append([1])elif i==1:res.append([1,1])else:res.append([1]*(i+1))for j in range(1,i):res[i][j]=res[i-1][j-1]+res[i-1][j]return res[-1]思路2:空間復雜度優化,只有上一行計算下一行:
class Solution(object):def getRow(self, rowIndex):if rowIndex==0:return [1]if rowIndex==1:return [1,1]pre=[1,1]for i in range(2,rowIndex+1):cur=[1]*(i+1)for j in range(1,i):cur[j]=pre[j-1]+pre[j]pre=curreturn cur2.3翻轉字符串里的單詞
給定一個字符串,逐個翻轉字符串中的每個單詞
**思路1:**要識別字符串中的每個單詞,然后調整順序。從最后開始遍歷,識別一個單詞后,往結果中添加。
class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""res =""n=len(s)flag=0 # 判斷是否開始識別一個單詞for i in range(n-1,-1,-1):#print(i,s[i],flag)if s[i]!=" " and flag==0: # 一個單詞的起始flag=1right=il_word=1elif s[i]!=" " and flag==1: # 單詞左下標往前走l_word+=1elif s[i]==" " and flag==1: # 單詞左下標走到了邊界word=s[right-l_word+1:right+1]flag=0res+=wordres+=" "elif s[i]==" " and flag==0: # 多個空格的時候continueif flag==1: #最后還需要判斷是否還有一個單詞word=s[right-l_word+1:right+1]flag=0res+=wordlen_res=len(res)if len_res==0:return ""if res[-1]==" ":res=res[0:-1]return res思路2:借助內置的函數
split() 將字符串按空格分成字符串數組
reverse() 將字符串數組翻轉
join 將字符串數組拼接鞥一個字符串。
2.4反轉字符串中的單詞3
給定一個字符串,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。
思路:識別一個單詞,送去翻轉,添加至結果后
2.5 刪除排序數組中的重復項
給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
**思路:**快慢指針:慢指針用于指示下一個寫數字的位置,快指針用于遍歷數組。每次判斷快指針指向的數字在數組是否重復出現,如果重復出現就下一個,如果不是重復出現就更新慢指針的數值。
2.6 移動零
給定一個數組,編寫程序,完成將所有的零移動至數組的末尾,其他元素相對位置不變。
要求:原地操作,盡量少的操作次數
暴力求解思路:每次移動一個0.時間復雜度o(n^2)
思路2雙指針技巧:慢指針之前的元素都是非零,快指針與慢指針之間的元素都是0
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)i,j=0,0while(i<n):if nums[i]:nums[i],nums[j]=nums[j],nums[i]j+=1i+=1總結
以上是生活随笔為你收集整理的算法(7)-leetcode-explore-learn-数据结构-数组-小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Python Cookbook 3rd
- 下一篇: 处理机器学习大数据的7种方法