LeetCode 33.搜索旋转排序数组

题目

  • 升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

实现

Java实现

思路: 暴力解法:遍历整个数组,如果找到目标值,则返回返回对应索引,否则返回-1

class Solution {
    public int search(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

思路: 二分搜索

  • 关键字:排序、搜索
  • 模式识别:有序或者部分有序,基本使用二分查找及其变种
  • 算法描述:丢弃一半的数据
  • 将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的,可以在使用常规二分搜索的时候查看当前mid为分割位置分割出来的两个部分[left,mid]和[mid+1,right]哪个部分是有序的,并根据有序的那个部分确定该如何改变二分搜索的上下界
    • 如果[left,mid-1]是有序数组,并且target的大小满足(nums[left],nums[mid])我们应该讲搜索范围缩小到[left,mid-1],否则在[mid+1,right]中寻找
    • 如果 [mid, right] 是有序数组,且 target 的大小满足 (nums[mid+1],nums[right]),则我们应该将搜索范围缩小至 [mid + 1, right],否则在 [left, mid - 1] 中寻找。
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[left] <= nums[mid]) {
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}
  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)

你可能感兴趣的:(LeetCode)