1. 程式人生 > 資訊 >我國普速鐵路首次上線“鐵路 e 卡通”:掃碼即可乘車,西安、延安等多車站可用

我國普速鐵路首次上線“鐵路 e 卡通”:掃碼即可乘車,西安、延安等多車站可用

題目描述

   給你一個有序陣列 nums ,請你 原地 刪除重複出現的元素,使每個元素 只出現一次 ,返回刪除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。

作者:力扣 (LeetCode)
連結:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

題目解析

1、首先我們需要明白什麼是原地演算法(in-place algorithm),它是一種使用小的,固定數量的額外之空間來轉換資料的演算法。

2、給定的陣列是有序的,不管是升序還是降序,重複出現的元素只可能在相鄰的元素上

題目解答

演算法1,時間複雜度o(n²)直接上程式碼,如下:

int process(int * nums,int numsSize)
{
 int saveNum=numsSize;
 for(int i=numsSize-1;i>0;i--)
 {
     if(nums[i]==nums[i-1])
     {
         for(int j=i-1;j<saveNum-1;j++)
         {
           nums[j]=nums[j+1];
         }
          saveNum--;
     }
 }
 return saveNum;
}
}

解題思路:有重複元素,我們就刪除重複元素。陣列中刪除元素是陣列的基本操作,這個我們都很熟悉,唯一需要注意的是元素刪除後陣列的長度會變短,因此我們需要主要迴圈的結束條件。我們使用兩層迴圈,外層迴圈遍歷陣列,內層需要執行陣列元素的刪除操作;由於是刪除操作,因此外層迴圈我們要採用倒敘的方式進行遍歷,內層迴圈開始點為要刪除的元素的索引,結束點為當前陣列所剩餘的長度。最後,返回剩餘元素的個數。

演算法2,時間複雜度o(n),程式碼如下:

int process(int* nums, int numsSize){
 int l=0;
 for(int i=0;i<numsSize;i++)
 {
     if(l<1||nums[l-1]!=nums[i])
    {
         nums[l++]=nums[i];
     }
 }
 return l;
}

解題思路:由於陣列是有序的,因此我們用兩個索引來遍歷陣列,第一個索引記錄當前遍歷過的陣列的有限長度,用 l 表示,第二個索引記錄當前遍歷過的陣列,用迴圈索引 i 表示。下標為i的元素和下標為l-1的元素,進行比較,不相等則將下標為i的元素賦值給下標為l的元素,此時有限陣列的長度增加了,因此l要進行+1操作;如果相等,則l不動,i繼續往下遍歷,直至遍歷完成。由於i首次遍歷後,陣列的有效長度肯定要加1,當時l-1為非法下標,因此l=0時的遍歷,一定要將陣列的有效長度 l 進行+1操作,for迴圈下的l<1的判斷條件就是為了解決這個用例。

兩種演算法已經講完了,歡迎指正批評