【算法】【线性表】【数组】搜索旋转排序数组(有重复数据)
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; } }
加油。
分类:
算法 / 数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了