int binarySearch(int[] nums, int target) {int left = 0, right = ...;while(...) {int mid = left + (right - left) / 2;if (nums[mid] == target) {...} else if (nums[mid] < target) {left = ...} else if (nums[mid] > target) {right = ...}}return ...;}
704. 二分查找

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while(left <= right){int mid = left + (right-left)/2;if(target > nums[mid]){left = mid + 1;}else if(target < nums[mid]){right = mid -1;}else{return mid;}}return -1;}}
33. 搜索旋转排序数组
容易考察
class Solution {/**首选,我们选择一个mid,那么mid的两侧必然一个是有序,一个是无序的,而判断有序那边只要看两侧端是不是左边小于右边即可然后我们继续收左右两侧去找target**/public int search(int[] nums, int target) {if(nums.length == 1){return nums[0] == target ? 0:-1;}int left = 0;int right = nums.length - 1;while(left <= right){int mid = left + (right - left)/2;if(nums[mid] == target){return mid;}if(nums[0] <= nums[mid]){//左边有序//这里nums[mid]不能在取了,因为在上面我们已经讨论了他的情况if(nums[0] <= target && target < nums[mid]){//左边有序,且target就包含在里面right = mid - 1;//收缩右边界}else{left = mid + 1;}}else{//右侧有序////这里nums[mid]不能在取了,因为在上面我们已经讨论了他的情况if(nums[mid] < target && target <= nums[nums.length-1]){//且target就包含在里面left = mid + 1;}else{right = mid - 1;}}}return -1;}}
300. 最长递增子序列 (不会!!)
其次容易考察
首先可以用动态规划来做
dp[i] 表示是以nums[i]结尾的最长递增字串的长度
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int [nums.length];
Arrays.fill(dp,1);//初始化数组
int res = 0;
for(int i = 0; i < nums.length; i++){
for(int j = 0; j <i; j++){
if(nums[j] < nums[i]){
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
res = Math.max(res,dp[i]);
}
return res;
}
}
4. 寻找两个正序数组的中位数 困难题
69. x 的平方根

class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
int ans = 0;
while(left <= right){
int mid = left + (right - left)/2;
if((long)mid * mid <= x){
ans = mid;
left = mid + 1;
}else{
right = mid -1;
}
}
return ans;
}
}
while(left <= right)的终止条件是left == right + 1,写成区间的形式就是[right + 1, right],或者带个具体的数字进去[3, 2],可见这时候区间为空,因为没有数字既大于等于 3 又小于等于 2 的吧。所以这时候 while 循环终止是正确的,直接返回 -1 即可。
class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
while(left <= right){
int mid = left + (right - left)/2;
if((long)mid * mid < x){
left = mid + 1;
}else if((long)mid * mid > x){
right = mid -1;
}else{
return mid;
}
}
return right;
}
}
240. 搜索二维矩阵 II


https://leetcode.cn/problems/search-a-2d-matrix-ii/solution/sou-suo-er-wei-ju-zhen-ii-cong-you-shang-e0vj/
初始化在右上角
如果当前值x == target return true
如果当前值x < target 我要让x大一些,就是让这一行的i++;
如果当前值x > target 我要让x小一些,就是让这一行的j—;
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int i = 0;
int j = matrix[0].length - 1;
while(i < matrix.length && j >= 0){
if(matrix[i][j] == target){
return true;
}else if(matrix[i][j] < target){
i++;//前进一行
}else{
j--;//回退一行
}
}
return false;
}
}
