由于數組是有序的,因此只要判斷當前數組元素是否與下一個數組元素相等即可,如果相等,那么就繼續向后遍歷,直到遇到一個不相等的。然后我們可以將這個不相等的,覆蓋到第一個重復元素的位置處,這樣子就能在不創建一個臨時數組的情況下,直接在原數組進行拷貝了。
遇到這種數組去重,刪特定值的時候,并且要求不能有新數組,那么一般可以考慮雙指針。
也就是定義兩個指針,一個slow指針,表示的是不重復元素下一次可以插入的位置,fast用于遍歷數組,找出不重復元素。
這里從下標1開始或者從下標0開始都是可以的。
public int removeDuplicates(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast< n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
刪除特定值既然也是不能創建臨時數組,那么就要考慮把特定值給他覆蓋掉。
由于要求刪除數組中等于 val 的元素,因此輸出數組的長度一定小于等于輸入數組的長度,我們可以把輸出的數組直接寫在輸入數組上。可以使用雙指針:右指針fast指向當前將要處理的元素,左指針slow指向下一個將要賦值的位置。
如果右指針指向的元素不等于 val,它一定是輸出數組的一個元素,我們就將右指針指向的元素復制到左指針位置,然后將左右指針同時右移;
如果右指針指向的元素等于 val,它不能在輸出數組里,此時左指針不動,右指針右移一位。
也就是,如果遍歷的指針(右指針)遇到的值等于val,那么直接忽略,但是如果遇到的值不是,那么就把這個值覆蓋到左指針指向的位置。
public int removeElement(int[] nums, int val) {
int slow = 0;//雙指針 slow代表的是非val值可以插入的下一個位置
int fast = 0;//fast用于遍歷
int n=nums.length;
while (fast
有序數組合并已知兩個有序數組,其中第一個有序數組的元素個數為m,第二個有序數組的個數為n。
因此為了能在第一個數組上直接對兩個數組進行合并,那么第一個數組的大小應該設定為m+n,也就是合并之后的總大小。
之后,就可以開始考慮如何把兩個數組進行合并了。其中第一個數組的尾部的數據均為0,長度為n。
大致如下
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
解釋:需要合并 [1,2,3] 和 [2,5,6] 。
合并結果是 [1,2,2,3,5,6] ,其中斜體加粗標注的為 nums1 中的元素。
考慮到當前數組1的尾部有空余元素,因此可以考慮尾插法,從兩個數組的有效數據的尾部開始遍歷,把更大的數據放在數組的尾部,這樣子就能節省一個臨時數組了。
// public static void merge(int[] nums1, int m, int[] nums2, int n) {
// for (int i=m,j=0;i= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] >nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
鏈表去重合并算法
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站標題:【Java算法】數組合并去重算法-創新互聯
文章來源:http://vcdvsql.cn/article26/csidcg.html
成都網站建設公司_創新互聯,為您提供面包屑導航、虛擬主機、網站收錄、電子商務、網站設計、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯