经典数据结构题目-数组
生活随笔
收集整理的這篇文章主要介紹了
经典数据结构题目-数组
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
704. 二分查找
-
解決思路
- 基于數(shù)組有序的特性,取其中一個(gè)值進(jìn)行比較,即可淘汰該值左邊或右邊的元素,縮小搜索的區(qū)間
- 使用兩指針標(biāo)記需要遍歷的區(qū)間,取中間值進(jìn)行比較,淘汰左邊或右邊元素,不斷移動(dòng)縮小遍歷的區(qū)間,即可查到
-
代碼
public int search(int[] nums, int target) { int l = 0; int r = nums.length - 1; while(l <= r){ // 注意點(diǎn)一 int mid = l + (r-l)/2; if(nums[mid] > target){ r = mid - 1; // 注意點(diǎn)二 }else if(nums[mid] < target){ l = mid + 1; }else{ return mid; } } return -1; } -
注意點(diǎn)
- 核心注意點(diǎn):避免漏檢元素
- 注意點(diǎn)一:while條件中選擇 l <= r 還是 l < r ,取決于 r 的取值;當(dāng) r = num.length時(shí),l 不能 <= r,可能會(huì)溢出
- 注意點(diǎn)二:當(dāng)選擇 l < r 的判斷時(shí),while中每次搜索的區(qū)間為 [l,r) 。當(dāng)num[mid] > target時(shí),r = mid,不能mid-1。因?yàn)閞所指向的元素在進(jìn)入第二次循環(huán)時(shí),是不會(huì)再與target比較,會(huì)導(dǎo)致漏檢
- 時(shí)間復(fù)雜度 O(logN) 。總共需要遍歷 log2N次,忽略常數(shù)2。
-
擴(kuò)展
-
當(dāng)元素可重復(fù)時(shí),如何定位到與target相等的最小索引
-
public static int search(int[] nums, int target) { int l = 0; int r = nums.length - 1; while(l <= r){ int mid = l + (r-l)/2; if(nums[mid] >= target){ // 等于target的時(shí)候 右指針繼續(xù)移動(dòng),繼續(xù)尋找最左邊的一個(gè) // 如果已達(dá)最左的一個(gè),再循環(huán)左指針會(huì)移動(dòng),最終會(huì)大于r,取到最左的 r = mid - 1; }else if(nums[mid] < target){ l = mid + 1; } } // 會(huì)存在找不到與target相等的情況 if(nums.length == l || nums[l] != target){ return -1; } return l; }
-
80. 刪除有序數(shù)組中的重復(fù)項(xiàng) II
-
解決思路
- 使用快慢指針遍歷,快指針用于判斷是否與上一個(gè)元素重復(fù),慢指針用于記錄下最終有效的數(shù)字
- 快指針判斷為不重復(fù),慢指針記下來(lái),同時(shí)向前移動(dòng)一位
-
代碼
public int removeDuplicates(int[] nums) { // 只允許元素出現(xiàn)一次的情況 int k = 1; int fast = k; int slow = k; // 注意點(diǎn)一 while(fast < nums.length){ if(nums[fast] != nums[fast-k]){ // 注意點(diǎn)二 nums[slow] = nums[fast]; slow++; } fast ++; } return slow; } -
注意點(diǎn)
- 核心注意點(diǎn):理清快慢指針?lè)謩e的作用
- 注意點(diǎn)一:快慢指針的起始位置,k <= nums.length時(shí),可以初始化快慢指針在k的位置開(kāi)始遍歷
- 注意點(diǎn)二:判斷元素是否超過(guò)k個(gè)重復(fù),因?yàn)閿?shù)組有序,如果當(dāng)前元素等于前k個(gè)位置的元素,說(shuō)明超過(guò)了
-
同類型題目
- https://leetcode.cn/problems/remove-element/description/
- https://leetcode.cn/problems/move-zeroes/description/
977. 有序數(shù)組的平方
-
解決思路
- 非遞減順序。即遞增但可以重復(fù)
- 使用雙向指針,比較兩指針指向元素的絕對(duì)值,絕對(duì)值大的計(jì)算平方添加進(jìn)結(jié)果數(shù)組
-
代碼
public int[] sortedSquares(int[] nums) { int[] res = new int[nums.length]; int l = 0; int r = nums.length-1; int index = nums.length - 1; while(l <= r){ if(Math.abs(nums[l]) > Math.abs(nums[r])){ res[index] = (int)Math.pow(nums[l],2); l++; }else{ res[index] = (int)Math.pow(nums[r],2); r--; } index --; } return res; } -
注意點(diǎn)
- 這里空間復(fù)雜度為O(1),不是O(n),因?yàn)榭臻g復(fù)雜度是計(jì)算非答案占用的空間
-
擴(kuò)展
-
想再節(jié)省空間的話,可以比較兩個(gè)數(shù)的平方后,進(jìn)行交換,右指針一直往前移即可
-
public int[] SortedSquares(int[] nums) { int left = 0; int right = nums.length-1; int leftR = 0, rightR = 0; while(right >= 0){ leftR = nums[left]*nums[left]; rightR = nums[right]*nums[right]; // 左指針的平方比較大,交換到數(shù)組的后面來(lái) if(leftR >= rightR){ nums[left] = nums[right]; nums[right] = leftR; }else{ nums[right] = rightR; } right--; } return nums; }
-
總結(jié)
以上是生活随笔為你收集整理的经典数据结构题目-数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络地图服务(WMS)详解
- 下一篇: JVM学习-类加载机制