LeetCode 查詢陣列系列

2021-07-31 11:41:49 字數 2885 閱讀 8708

33. search in rotated sorted array

題目:在乙個被旋轉一次的遞增陣列中找到目標值。

思路:二分法——思路一定要清晰!!!當mid和目標值不等時,判斷mid和start的大小,大於說明旋轉位置在後面,反之在前面。在後面的時候start-mid是遞增的,可以直接判斷目標值在不在其中。同理,在前面的時候mid-end是遞增的,可以直接判斷目標值在不在其中。

public class solution 

else

}else

else}}

return -1;

}}

81. search in rotated sorted array ii

題目:有重複怎麼辦?

思路:在33題基礎上,判斷start等於mid時,只能start++遍歷移動,因為此時無法判斷旋轉點在前半段還是後半段。

public class solution 

else

}else if(nums[mid] < nums[start])

else

}else

}return false;

}}

153. find minimum in rotated sorted array

題目:在乙個旋轉陣列中找到最小值。

思路:二分法——利用二分法將start和end卡在正好反轉的兩端,由此只需判斷mid與其前後數的關係就可以找到正好旋轉的那一點,即找到最小值。

public class solution 

else

}return nums[0];

}}

34. search for a range

題目:在陣列中找到目標值的範圍,沒有的話用【-1,-1】表示。

思路:二分法——基本的思想是先用二分找到目標值,在分別在【start,mid】以及【mid,start】兩個區間內繼續利用二分找到上範圍和下範圍。

public class solution ;

if(nums.length < 1) return ret;

int start = 0, end = nums.length-1;

while(start <= end)

else

}//ret[0] = nums[start]==target?start:start+1;

ret[0] = start;

}mid = mid_cp;

if(nums[end] == target) ret[1] = end;

else

else

}//ret[1] = nums[end]==target?end:end-1;

ret[1] = end;

}return ret;

}else if(nums[mid] > target)

else

}return ret;

}}

278. first bad version

題目:在1到n中找到第乙個壞版本。

思路:二分——很簡單,但是要注意用start+(end-start)/2,不要用(start+end)/2,不然就tle。

/* the isbadversion api is defined in the parent class versioncontrol.

boolean isbadversion(int version); */

public class solution extends versioncontrol

else

}return start;

}}

374. guess number higher or lower

題目:猜數字

思路:二分——很簡單

/* the guess api is defined in the parent class guessgame.

@param num, your guess

@return -1 if my number is lower, 1 if my number is higher, otherwise return 0

int guess(int num); */

public class solution extends guessgame

else

}return start;

}}

35. search insert position

題目:找到目標值或者應該插入的位置

思路:二分法——很簡單

public class solution 

else

}return start;

}}

41. first missing positive

題目:找到陣列中第乙個不見的正整數

思路:分三步:第一步將負數標記為0,第二步將每位非零數對應的位置上標記為負數,0則標記為該位正整數的負數。第三步統計第乙個非負數的位置,返回。

public class solution 

for(int i = 0; i < nums.length; i++)

else if(nums[x-1] > 0)}}

for(int i = 0; i < nums.length; i++)

return nums.length+1;

}}

其他的解法有將數通過交換放在對應位置上,最後統計如果存在不對應的就返回。

LeetCode 陣列系列(間隔)

56.merge intervals 題目 interval包含start和end,將重疊部分合併 思路 用start和end標記目前的最後乙個,但不急著加到list裡面,因為可能有變化,對list操作時間複雜度高。還需要注意對interval型別進行compare函式重寫,或是使用匿名比較器。de...

leetcode連續陣列系列

560 和為k的子陣列 給定乙個整數陣列和乙個整數 k,你需要找到該陣列中和為 k 的連續的子數 組的個數。示例 1 輸入 nums 1,1,1 k 2 輸出 2 1,1 與 1,1 為兩種不同的情況。這道題暴力的解法就是先儲存陣列的字首和,然後遍歷差分,求所有和為k的子陣列,時間複雜度為o n 2...

Leetcode 陣列之和系列

leetcode 1.兩數之和 方法1 排序 查詢 方法2 雜湊法 class solution def twosum self,nums list int target int list int sum 0 m for i in range len nums sum nums i if targe...