LeetCode - 33. Search in Rotated Sorted Array

来源:互联网 发布:caffe softmax layer 编辑:程序博客网 时间:2024/05/02 02:58

题目的要求是从一个有可能被折断的排序过的数组当中找到target,并且返回target的index。首先注意这道题目中的“有可能”三个字,这就说明题目中给出的数组可能被折断了,也可能没有被折断,所以应该是有以下三种情况:


第一中情况是没有被折断的时候,第二种情况和第三种情况分别是可能被折断的情况。

这是刷LeetCode以来遇到的第一个标记为Hard的题目,所以开始做的时候还是非常激动的,看了题目之后只是觉得题目的情况非常复杂,但是没有认真去分析可能出现的折断的情况,这是要避免的。记的好像在算法导论的前几章有一个例子也是需要这样分情况去讨论折断的情况,所以以后遇到不连续的折断类问题都可以采用这种相似的方法去画图分析。

在看了题目之后我发现,这道题目好像就是从数组里面找出一个数字...唔...既然是数组,那么好像是可以线性查找的吧,于是我就试了试...结果竟然accept了....说好的Hard类题目呢!!!鉴于这种方法实在太简单,就不贴代码了...

当然,这道题目使用线性搜索的时间复杂度是O(n),而且题目中还有一个排序的条件没有用到,既有排序,又是从数组里面找元素,不试试二分查找简直对不起自己。使用二分查找的思路是对的,但关键问题是怎样修改二分查找,使其对可能出现的三种情况都可以照顾到。这里采用的大分类标准是比较left和mid的大小,如果left <= mid的话,那么是第一种情况和第二种情况,继续可以情况2中target的位置进行分类更新二分查找的两头;如果left > mid那么是第三种情况,这时候可以继续根据target的相对位置进行分类。

同时要注意一个问题,在二分查找中,条件判断中的大小问题并不是严格的小于或者大于,而是会附加等号的。

public class Solution {    public int search(int[] nums, int target) {        //extreme situation        if(nums == null) return -1;                int l = 0;        int r = nums.length - 1;                //binary search        while(l <= r){            int mid = (l + r) / 2;            if(nums[mid] == target){                return mid;            }else if(nums[l] <= nums[mid]){                //target is in the left part of situation 2                if(nums[l] <= target && target <= nums[mid]){                    r = mid - 1;                }else{                    l = mid + 1;                }            }else{                //target is in the right part of situation 3                if(nums[mid] <= target && target <= nums[r]){                    l = mid + 1;                }else{                    r = mid - 1;                }            }        }                return -1;    }}


0 0