2020/10/16刪除排序陣列中都重複項
阿新 • • 發佈:2020-10-16
leetCode題目-刪除排序陣列中都重複項
給定一個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。
示例 1:給定陣列 nums = [1,1,2],
函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。
你不需要考慮陣列中超出新長度後面的元素。
來源:力扣(LeetCode)
程式碼樣式
class Solution { public int removeDuplicates(int[] nums) { } }
我的程式碼,難得這麼強,太激動了!
class Solution { public int removeDuplicates(int[] nums) { if(nums.length==0)return 0; int cur=nums[0]; int index=1; for(int i=1;i<nums.length;i++){ if(nums[i]>cur){ nums[index]=nums[i]; index++; cur=nums[i]; } } return index; } }
思路
- 首先對題目的分析,返回的是一個整型但輸出的是陣列。事實上就是需要你在nums的基礎上對他進行改造,將重複項去掉,並把改造後的資料從陣列下標為0開始的地方依次放入,最後的輸出就是根據你返回的整型值來遍歷nums陣列的前多少項。因此也不用在意陣列中,超出你給定長度的元素。
程式碼分析
- 首先對nums數字是否為空進行判斷
- 其次給一個cur和index,cur表示需要比較的下標的陣列的值,index表示需要被替換掉的元素的下標。
- 因為nums本身是排好序的,所以nums[0]一定是最小的元素。因此
cur=nums[0],之後插入的元素也只需要從下標1開始,得出index=1 - 再從下標為1開始遍歷陣列,只要出現比cur大的值,就將值賦給下標為index的陣列,同時index++指向下一個需要改變陣列值的位置,之後cur變成當前需要比較的值cur=nums[i]
- 最後返回index,雖然index表示的是下標,而題目需要的是陣列的有效長度,但可以發現index一直都是指向當前元素cur的後面一個位置,所以index=陣列的有效長度。
官方題解:雙指標演算法
演算法
陣列完成排序後,我們可以放置兩個指標 iii 和 jjj,其中 iii 是慢指標,而 jjj 是快指標。只要 nums[i]=nums[j]nums[i] = nums[j]nums[i]=nums[j],我們就增加 jjj 以跳過重複項。
當我們遇到 nums[j]≠nums[i]nums[j] \neq nums[i]nums[j]=nums[i] 時,跳過重複項的執行已經結束,因此我們必須把它(nums[j]nums[j]nums[j])的值複製到 nums[i+1]nums[i + 1]nums[i+1]。然後遞增 iii,接著我們將再次重複相同的過程,直到 jjj 到達陣列的末尾為止。
程式碼
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
思路
和我的想法類似,我是把一個指標直接換成值,官方的效率更高
最後再說一下將圖片儲存到markdown中
- 需要用到base64圖片轉碼工具
base64圖片轉碼工具 - 最後在md檔案中的的格式,因為轉碼後會有巨多字元,所以需要使用標籤
- 標籤格式![avatar][dog]
- 文末格式[dog]:data:image/png....;