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