33. 搜索旋转排序数组
二分:
java
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(l<=r){
int mid = l+(r-l)/2;
if(nums[mid] == target){
return mid;
}
// 在看这种算法题时,如果对某个边界条件存疑,最好的办法就是拿一个n=2的数组模拟一下,
// 通常90%的边界Bug都会在n=2时现形
if(nums[0] <= nums[mid]){
//这里不写target<=nums[mid]是因为前面判断过了target和nums[mid]的关系
if(nums[0]<=target && target<nums[mid]){
r = mid-1;
}
else{
l = mid + 1;
}
}
else{
if(nums[mid]<target && target<=nums[n-1]){
l = mid + 1;
}
else{
r = mid - 1;
}
}
}
return - 1;
}
}
时间复杂度:O(logN)
空间复杂度:O(1)
74. 搜索二维矩阵
二分:
java
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)