Search in Rotated Sorted Array II

来源:互联网 发布:淘宝类目数据 编辑:程序博客网 时间:2024/06/14 06:45

Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.
思路:这个题目比上一个题目多加了数字可以重复的条件,问题来了,由于出现了重复的数字,比如1 1 1 1 3 1 1 1,这个时候中间的数字和左右两边的数字都相等,所以这时采用折半查找无法正确的分区间,当遇到这种情况的时候,就left++,right–,直到中间的数字不与左右两端的数字相等,然后就可以正确的分区间,较上一个题目只要修改一点点。。或者不使用left++和right–,循环判断left到mid之间的数字,如果出现了某个数字大于nums[mid],说明mid所处于的是在后一半有序数字,否则left到mid之间的数字全部小于nums[mid],这个时候说明mid所在的地方处于前一半数字。不过这种方法的时间复杂度快接近线性的了

public class Solution {    public boolean search(int[] nums, int target) {            int left = 0;        int length = nums.length;        int right = length - 1;        while (left <= right && left <= (length - 1) && right <= (length - 1)) {            int mid = (left + right) / 2;            if (nums[mid] == target || nums[left] == target                    || nums[right] == target)                return true;            if(nums[mid] == nums[left] && nums[mid] == nums[right]) {                ++left;                right--;            }            else           {    if (nums[mid] <= nums[right])              {                if (nums[mid] < target && nums[right] > target) left = mid + 1;                else right = mid - 1;             } else {                if (nums[mid] > target && nums[left] < target)                    right = mid - 1;                else                    left = mid + 1;            }            }        }        return false;    }}
0 0
原创粉丝点击