1. 程式人生 > 實用技巧 >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....;

2020-10-16今天僅花2小時就完成了演算法和演算法的總結,太棒了,開心,把昨天新鞋開膠的煩惱都沖走,下午可以開始繼續springboot的學習了。同時還發現了我的大愛鞋款 匡威OneStarPro和new balance880,主要是在我的經濟承受能力範圍之內選擇的,要不然太多了,雙十一儘量把兩雙都買回來,匡威是可以的,但880最近溢價太嚴重了,還可能沒有灰色配色,不好說,無情!