注意:
由于數(shù)組
地址是連續(xù)的
,所以在刪除或插入元素的時(shí)候,都要移動(dòng)后面的元素
??對(duì)于二維數(shù)組的話,C++是地址是連續(xù)的,java不連續(xù)。 java的地址如下圖:
二分查找 Leetcode704 題目連接:二分查找 Leetcode704 - 簡(jiǎn)單 思路本題主要有兩種解法:一是左閉右閉[ , ]
,一種是左閉右開(kāi)[ , )
,在大部分的題型中都采用左閉右開(kāi)的方法。
1、左閉右閉
public int search(int[] nums, int target) { int left = 0;
int right = nums.length - 1;
// 左閉右閉的情況可以取到中間的值
//如[01234],當(dāng)left=2 right=2 target=2,若letf // int middle = (left + right) / 2; 可能會(huì)溢出
int middle = left + ((right - left)>>1);
if (nums[middle]< target){// [,target]目標(biāo)值在右邊
left = middle + 1; // 調(diào)整左區(qū)間[middle+1,],左為閉區(qū)間 要 +1
}else if(nums[middle] >target){// [target,]目標(biāo)值在左邊
right = middle - 1; // 調(diào)整右區(qū)間[,middle-1],右為閉區(qū)間 要 -1
}else { return middle; // 找到則返回下標(biāo)
}
}
return -1;
}
2、左閉右開(kāi)
public int search(int[] nums, int target) {int left = 0;
int right = nums.length; // 這里不-1
// 因?yàn)橛疫吶〔坏?,所以不用取? //如[01234],當(dāng)target=2 left=2 right=3時(shí)就返回了,所以不用取等
while (left< right){int middle = left + ((right - left) >>1);
if (nums[middle]< target){// [,target)在目標(biāo)值右邊
left = middle + 1; // 左為閉區(qū)間要 + 1
}else if(nums[middle] >target){// [target,)在目標(biāo)值左邊
right = middle; // 右邊取不到的,直接取等
}else {return middle;
}
}
return -1;
}
總結(jié)1、遇到問(wèn)題:在寫左閉右開(kāi)的時(shí)提交一直不對(duì),是由于沒(méi)考慮到right = nums.length
此時(shí)右區(qū)間不用減一,因?yàn)橛覅^(qū)間取不到。
2、注意: 取中間值最好用位運(yùn)算middle = left + ((right - left) >>1)
,雖然直接寫middle = (left + right) / 2
也能通過(guò),但是就怕其他情況出現(xiàn)溢出。還有一個(gè)注意點(diǎn)就是middle的位置
和left ?= right
此題不能有額外的數(shù)組空間,也就是進(jìn)行原地修改,修改后直接返回?cái)?shù)組長(zhǎng)度就實(shí)行了。所以把需要修改元素位置找到,后面的再依次填充就好了
- - 雙指針解法
快指針:指向數(shù)組下標(biāo),若不是目標(biāo)值就更新,是目標(biāo)值就跳過(guò)。
慢指針:指向更新數(shù)組的下標(biāo)
1、暴力解法
public int removeElement(int[] nums, int val) { int count = nums.length;
// i if (nums[i] == val){ for (int j = i+1; j< count; j++) { nums[j-1] = nums[j];
}
// System.out.println("看一下nums" + Arrays.toString(nums));
i--;
count--;
}
}
return count;
}
2、雙指針(推薦)
public int removeElement(int[] nums, int val) {// 慢指針,用于存儲(chǔ)新的數(shù)組元素,每次儲(chǔ)存一位就后移一位
int slow = 0;
// 快指針,用于復(fù)制原數(shù)組里面不包含val的數(shù)
for (int fast = 0; fast< nums.length; fast++) {if (nums[fast] != val){nums[slow++] = nums[fast];
}
}
return slow;
}
總結(jié)1、遇到的問(wèn)題: 在寫暴力的時(shí)候一直輸出錯(cuò)誤,錯(cuò)在我一開(kāi)始寫的循環(huán)結(jié)束條件為i< nums.length
,但是這樣就沒(méi)有考慮到每次后移最后就是目標(biāo)值,這樣就會(huì)進(jìn)入死循環(huán)。
2、熟練使用雙指針可解決大部分?jǐn)?shù)組的題,若不太會(huì)就畫出圖或是打輸出語(yǔ)句。
你是否還在尋找穩(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)頁(yè)名稱:【代碼訓(xùn)練營(yíng)】day1|704.二分查找&27.移除元素-創(chuàng)新互聯(lián)
本文鏈接:http://www.rwnh.cn/article28/jdhjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、定制開(kāi)發(fā)、標(biāo)簽優(yōu)化、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、企業(yè)建站
聲明:本網(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)容