首页 > 编程语言 >【算法】【线性表】搜索旋转排序数组(有重复数据)

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

时间:2023-12-09 18:00:14浏览次数:43  
标签:false 线性表 int 重复 算法 数组 left 排序 target

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;
    }
}

加油。

标签:false,线性表,int,重复,算法,数组,left,排序,target
From: https://www.cnblogs.com/kukuxjx/p/17891266.html

相关文章

  • linux的sort排序功能
    环境centos7.9sort介绍Linux中的sort功能是一个非常实用的工具,它可以对文本文件进行排序。sort命令可以根据用户指定的规则对文本文件中的行进行排序,并将结果输出到标准输出或指定的文件中简单使用语法sort[选项][文件名]其中,选项可以是以下之一:-r:逆序排序(默认为升序)-n......
  • 直播系统源码,常见的混音算法有哪些?
    声音是由于物体的振动对周围的空气产生压力而传播的一种压力波,转成电信号后经过抽样,量化,仍然是连续平滑的波形信号,量化后的波形信号的频率与声音的频率对应,振幅与声音的音量对应,在直播系统源码中,量化的语音信号的叠加等价于空气中声波的叠加,所以当采样率一致时,混音可以实现为将各......
  • 1.理论、算法、协议
    1.CAP理论CAP也就是Consistency(一致性)、Availability(可用性)、PartitionTolerance(分区容错性)这三个单词首字母组合。在理论计算机科学中,CAP定理(CAPtheorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:一致性(Consistency):所有节点访问......
  • 电台覆盖区域的贪心算法
    1.贪心算法电台覆盖区域求最优解问题题目:假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号广播台覆盖地区K1“北京”,“上海”,“天津”K2“广州”,“北京”,“深圳”K3“成都”,“......
  • 详解十大经典排序算法(六):快速排序(QuickSort)
    算法原理分区(Partition):选择一个基准元素,将数组分为两个子数组,小于基准的放在左边,大于基2准的放在右边。递归排序:对左右两个子数组分别进行快速排序。合并:不需要实际的合并操作,因为在分解和递归排序阶段已经完成了排序。算法描述快速排序是一种基于分治思想的高效排序算法,由英国......
  • 最小费用组最大流——EK算法
    时间复杂度O(nm^2),理论上限//n,m,s,t,分别代表该网络的点数n,网络的边数m,源点编号s,汇点编号t。constintN=5010,M=100010,INF=1e8;intn,m,S,T;structedge{intv,c,w,ne;}e[M];inth[N],idx=1;//从2,3开始配对intd[N],mf[N],pre[N],vis[N];intflow,cost;voidadd(inta,......
  • Python算法——快速排序
    快速排序(QuickSort)是一种高效的分治排序算法,它选择一个基准元素,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地排序子数组。快速排序通常比冒泡排序和选择排序更高效,特别适用于大型数据集。本文将详细介绍快速排序的工作原理和Python实现。快速排序的工作原......
  • 双栈排序
    还是建议看看yxc的题解这是先考虑了一个栈的情况,再从一个栈的情况扩充到两个栈来说明一下他对性质的证明首先满足条件的二元组式肯定不能够被放在同一个栈里面的,那么如果我将原序列分成两个组,其中每个组中的任意二元组都不满足条件(注意\(k\)不一定要局限于分组之后的同一组,而是......
  • 基于小波变换的分形信号r指数求解算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       基于小波变换的分形信号r指数求解算法是一种利用小波变换和分形理论对信号进行分析的方法。下面将详细介绍这种算法的原理和数学公式。         分形信号是一种......
  • 智能AI算法解决各行业中的皮带跑偏、异物问题的有效方法
    随着工业化的发展,皮带输送机已经成为各行业中不可或缺的重要设备,但是在使用过程中,由于各种原因,皮带常常出现跑偏问题,给生产运营带来了诸多困扰。不仅仅是矿山行业,钢铁、火电、港口等行业也都面临着皮带跑偏问题。那么,对于这些行业,如何解决皮带跑偏问题呢?矿山行业是皮带输送机的主要......