數據結構與算法之數組去重復
從排序數組中刪除重復項
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數組 nums = [1,1,2],
函數應該返回新的長度 2, 並且原數組 nums 的前兩個元素被修改為 1
, 2
。
你不需要考慮數組中超出新長度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數應該返回新的長度 5, 並且原數組 nums 的前五個元素被修改為 0
, 1
, 2
, 3
, 4
。
你不需要考慮數組中超出新長度后面的元素。
分析思路:
1、不能創建新的數組
2、需要去掉重復的元素
3、函數需要返回新的長度
需要滿足上述條件,只能在原數組中修改值,比方說原數組為array = {1,2,2,3,4},數組長度為5。假設有一個新的數組來存放新的排序結果(這個數組實際不存在),
newArray = {1,2,3,4,4}。新數組的前4位為{1,2,3,4},函數返回新的長度為4。因此需要定義一個變量size,用來統計數組中沒有重復元素的個數。
1 /**數組去重復*/
2 public static int removeRepeted(int[] array){ 3 if(array == null && array.length == 0){ 4 return 0; 5 } 6 /**size:用來統計數組中沒有重復的元素個數*/
7 int size = 0; 8 for (int i = 0; i < array.length; i++) { 9 if (array[i] != array[size]){ 10 /**修改數組中的值*/
11 array[++size] = array[i]; 12 } 13 } 14 /**返回沒有重復的個數*/
15 return size+1; 16
17 }
具體分析如下:
int size = 0;
int[] array = {1,2,2,3};
第一步:判斷array[size]與array[0]是否相等,兩者相等,
int array = {1};
第二步:判斷array[size]與array[1]是否相等,array[size] = 1,array[i] = 2,兩者不等
int array = {1,2};
此時size++,size = 1;
第三步:判斷array[size]與array[2]是否相等,array[size] = 2,array[i] = 2,兩者相等
第四步:判斷array[size]與array[3]是否相等,array[size] = 2,array[i] = 3,兩者不等
將array[2]的值修改為array[3]的值,即array[size] = array[3]。
int array = {1,2,3,3}
此時size++,size = 2;