【算法】【线性表】【数组】搜索旋转排序数组(有重复数据)
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; } }
加油。