【算法】【线性表】搜索旋转排序数组(有重复数据)

发布时间 2023-12-09 17:59:25作者: 酷酷-

1  题目

跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。

样例 1:

输入:

A = []
target = 1

输出:

false
 

解释:数组为空,1不在数组中。

样例 2:

输入:

A = [3,4,4,5,7,0,1,2]
target = 4

输出:

true

解释:4在数组中。

2  解答

跟昨天的题有点类似哈,昨天的数组中是没有重复的,今天的是有重复的,重复的影响就是在于会对旋转后的,哪一边是顺序的判断有影响,所以相对于昨天的代码,在判断左右哪边是有序之前,左右进行了两个过滤后,然后判断哪边有序就跟昨天的代码一致了哈:

public class Solution {
    /**
     * @param a: an integer ratated sorted array and duplicates are allowed
     * @param target: An integer
     * @return: a boolean 
     */
    public boolean search(int[] a, int target) {
        // write your code here
        // 1、如果数组为空或者长度为0 则直接返回false
        if (a == null || a.length == 0) {
            return false;
        }
        // 2、二分查找
        int left = 0;
        int right = a.length - 1;
        int middle = 0;
        while (left <= right) {
            middle = (left + right) / 2;
            if (a[middle] == target) {
                return true;
            }
            while (a[left] == a[middle] && left < middle) {
                left ++;
            }
             while (a[right] == a[middle] && right > middle) {
                right --;
            }
            // 说明左边有序 
            // 这里跟昨天的题不一样,因为有重复了,这里left<=middle判断哪边有序就不准确了
            // 所以上边先对重复的进行左右过滤,好确定哪边有序
            if (a[left] <= a[middle]) {
                if (target >= a[left] && target <= a[middle]) {
                    right = middle - 1;
                } else {
                    left = middle + 1;
                }
            } else {
                if (target >= a[middle] && target <= a[right]) {
                    left = middle + 1;
                } else {
                    right = middle - 1;
                }
            }
        }
        return false;
    }
}

加油。