先找個(gè)例子寫(xiě)出來(lái)然后再找規(guī)律寫(xiě)代碼锅睛,然后去找測(cè)試用例運(yùn)行疚膊,通過(guò)例子去找自己邏輯沒(méi)有考慮全面的地方义辕,但在企業(yè)的項(xiàng)目需求中,可能并沒(méi)有好的示例寓盗,所以要自己想好if的條件判斷灌砖,一定要先理清需求,然后再想好邏輯傀蚌,最后寫(xiě)代碼基显、、喳张、
class Solution {
public int findMin(int[] nums) {
int length = nums.length;
if(length==1) return nums[0];
// if(length==2) return nums[0]>nums[1]?nums[1]:nums[0];
int i=0,j=length-1,min=nums[0];
while (i<=j){
int mid=(i+j)/2;
if(nums[mid]<min) min=nums[mid];
//左邊有序
if(nums[mid]>nums[i]){
if(nums[j]<nums[i]){
i=mid+1;
}else {
j=mid-1;
}
}else {
if(mid==i) return nums[mid]>nums[j]?nums[j]:nums[mid];
if(mid-1>=0 && nums[mid]<nums[mid-1]) return nums[mid];
else {
j=mid-1;
}
}
}
return min;
}
}
或者
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left];
}
};
作者:armeria
鏈接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/126635/er-fen-cha-zhao-wei-shi-yao-zuo-you-bu-dui-cheng-z/
來(lái)源:力扣(LeetCode)
著作權(quán)歸作者所有续镇。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處销部。
完蛋,我感覺(jué)我的代碼能力退化了
class Solution {
public int findMin(int[] nums) {
int i = 0, j = nums.length - 1;
while (i < j) {
int m = (i + j) / 2;
if (nums[m] > nums[j]) i = m + 1;
else if (nums[m] < nums[j]) j = m;
else j--;
}
return nums[i];
}
}
如果是這種需要情況分層列舉的時(shí)候制跟,如果第二層的代碼規(guī)律非常的難找或者不好寫(xiě)代碼舅桩,那么就很可能是第一層的規(guī)律找錯(cuò)了,或者是寫(xiě)第一層的時(shí)候沒(méi)有去考慮第二層雨膨、擂涛、、
第一層先分左邊是否有序聊记,然后第二層再去研究大小問(wèn)題撒妈,這樣就很好寫(xiě)
革命尚未成功,同志仍需努力呀排监!
class Solution {
public boolean search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return false;
}
int start = 0;
int end = nums.length - 1;
int mid;
while (start <= end) {
mid = start + (end - start) / 2;
if (nums[mid] == target) {
return true;
}
if (nums[start] == nums[mid]) {
start++;
continue;
}
//前半部分有序
if (nums[start] < nums[mid]) {
//target在前半部分
if (nums[mid] > target && nums[start] <= target) {
end = mid - 1;
} else { //否則狰右,去后半部分找
start = mid + 1;
}
} else {
//后半部分有序
//target在后半部分
if (nums[mid] < target && nums[end] >= target) {
start = mid + 1;
} else { //否則,去后半部分找
end = mid - 1;
}
}
}
//一直沒(méi)找到舆床,返回false
return false;
}
}
當(dāng)三道一起寫(xiě)完的時(shí)候棋蚌,再一起看,為什么最后一道題是分層寫(xiě)的挨队?因?yàn)楸容^的數(shù)更多谷暮,i,j,mid,target
所以要分層寫(xiě)