33. 搜索旋转排序数组二分class Solution { public int search(int[] nums, int target) { int n nums.length; if(n 0){ return -1; } if(n 1){ return nums[0]target?0:-1; } int l 0; int r n-1; while(lr){ int mid l(r-l)/2; if(nums[mid] target){ return mid; } // 在看这种算法题时如果对某个边界条件存疑最好的办法就是拿一个n2的数组模拟一下 // 通常90%的边界Bug都会在n2时现形 if(nums[0] nums[mid]){ //这里不写targetnums[mid]是因为前面判断过了target和nums[mid]的关系 if(nums[0]target targetnums[mid]){ r mid-1; } else{ l mid 1; } } else{ if(nums[mid]target targetnums[n-1]){ l mid 1; } else{ r mid - 1; } } } return - 1; } }时间复杂度O(logN)空间复杂度O(1)74. 搜索二维矩阵二分class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m matrix.length; int n matrix[0].length; int left 0; int right m*n-1; while(left right){ int mid left (right-left)/2; int x matrix[mid/n][mid%n]; if(x target){ return true; } else if(x target){ left mid 1; } else{ right mid - 1; } } return false; } }时间复杂度O(logMN)空间复杂度O(1)核心把二维数组展开成一行数组找对应下标(i)与行与列的关系row i/n col i%n