日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法(7)-leetcode-explore-learn-数据结构-数组-小结

發布時間:2023/12/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法(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:]求逆

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."""def rever_nums(nums,l,r): # 原地置換,用index操作,nums[:flag]只是一個備份,沒有修改元數組while(l<r):nums[l],nums[r]=nums[r],nums[l]l+=1r-=1n=len(nums)flag=k%nrever_nums(nums,0,n-1)rever_nums(nums,0,flag-1)rever_nums(nums,flag,n-1)return nums

思路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)時間超出限制

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)flag=k%nfor i in range(flag):current=nums[n-1]for j in range(n): # j:[0,n-1]temp=nums[j]nums[j]=currentcurrent=tempreturn nums

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 cur

2.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 將字符串數組拼接鞥一個字符串。

class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""s_arr=s.split()s_arr.reverse()res=" ".join(s_arr)return res

2.4反轉字符串中的單詞3

給定一個字符串,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。
思路:識別一個單詞,送去翻轉,添加至結果后

class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""def rever_word(word):n=len(word)re_word=""for i in range(n-1,-1,-1):re_word+=word[i]#print(re_word)return re_wordn=len(s)l,r=0,0res=""while(r<n):if s[r]!=" ":r+=1elif s[r]==" ":word=s[l:r]res+=rever_word(word)res+=" "l=r+1r+=1word=s[l:r+1]res+=rever_word(word)return res

2.5 刪除排序數組中的重復項

給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
**思路:**快慢指針:慢指針用于指示下一個寫數字的位置,快指針用于遍歷數組。每次判斷快指針指向的數字在數組是否重復出現,如果重復出現就下一個,如果不是重復出現就更新慢指針的數值。

class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)l=0target="INF"for r in range(n):if nums[r]!=target:target=nums[r]nums[l]=nums[r]l+=1 #指示下一個可以寫的位置return l

2.6 移動零

給定一個數組,編寫程序,完成將所有的零移動至數組的末尾,其他元素相對位置不變。
要求:原地操作,盡量少的操作次數
暴力求解思路:每次移動一個0.時間復雜度o(n^2)

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=0j=n-1while(i<n and i<j): # print(i,j,nums)if nums[i]==0: # 置換完i不是立即+1,換完nums[i]處還可能是1for k in range(i,j):nums[k],nums[k+1]=nums[k+1],nums[k]j-=1else:i+=1 return nums

思路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-数据结构-数组-小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。