首页 > 其他分享 >Leetcode面试经典面试题-81.搜索旋转排序数组II

Leetcode面试经典面试题-81.搜索旋转排序数组II

时间:2024-08-20 14:52:55浏览次数:7  
标签:面试题 right return target nums mid II 81 left

解法都在代码里,不懂就留言或者私信,这个题目一定要注意重复元素的情况sh

public static boolean search(int[] nums, int target) {
        /**空数组不可能找到任何数*/
        if(nums == null || nums.length == 0) {
            return false;
        }
        /**如果就一个数看看相等不想等就行,这个其实也可以包括这下面的查找过程中*/
        if(nums.length == 1) {
            return target == nums[0];
        }
        /**其他的情况我们采用二分查找(伪二分)*/
        return searchInRange(nums, 0, nums.length - 1, target);
    }

    public static  boolean searchInRange(int[] nums, int left, int right, int target) {
        if(left > right) return false;
        if(nums[left] == target || nums[right] == target) {
            return true;
        }
        while(left <= right) {
            /**本题的难度在于可以重复,那我们就只能根据某个条件判断一个区间发生了反转,而另外一个区间是有序的
             * 如果大于等于有序区间最小值,小于等于有序区间最大值就可以使用二分查找在有序区间查找
             * 否则继续while循环,只是把left和right做相应的变更
             * 下面我们分析具体的场景:1. 如果mid位置的值比left和right位置的都大,说明mid~right之间一定发生了反转
             * 而left~mid之间是有序的 2. 如果mid位置的值比left和right位置都小,则left~mid之间一定发生了反转,而
             * mid~right之间是有序的 3.其他情况因为涉及重复的情况,无法判断,只能顺序查找了*/
            int mid = left + ((right-left)>>1);
            if(nums[mid] == target) {
                return true;
            }
            if(nums[mid] > nums[left] && nums[mid] > nums[left]) {
                if(nums[left] < target && nums[mid] > target) {
                    return bSearch(nums, left + 1, right - 1, target);
                } else {
                    return searchInRange(nums, mid + 1, right, target);
                }
            } else if(nums[mid] < nums[left] && nums[mid] < nums[right]) {
                if(nums[mid] < target && nums[right] > target) {
                    return bSearch(nums, mid + 1, right - 1, target);
                } else {
                    return searchInRange(nums, left + 1, right - 1, target);
                }
            } else {
                return searchInRange(nums, left + 1, mid - 1, target) || searchInRange(nums, mid+1,right-1, target);
            }
        }
        return false;

    }
    public static boolean bSearch(int[] nums, int left, int right, int target) {
        if(left > right) {
            return false;
        }
        while(left <= right) {
            int mid = left + ((right-left)>>1);
            if(nums[mid] == target) {
                return true;
            } else if(nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }

某些原因无法上网站执行,贴一个手机的结果,这个题目也是我临时写的,可能有的考虑不一定周全,如果有更优解法,稍后我再贴上来

 c91c4cf058354025bdd4544966b78745.jpg

标签:面试题,right,return,target,nums,mid,II,81,left
From: https://blog.csdn.net/Chang_Yafei/article/details/141358658

相关文章

  • nginx基础面试题
    1、破解密码:1、首先重启虚拟机,启动的时候马上按e键进入安全模式2、在有Linux那行的最后面加上rd.break3、ctrl+x将文件4、以读写的方式重新挂载:mount-oremount,rw/sysroot5、进入路径:chroot/sysroot6、改写密码:passwd6、打安全标签:touch/.autorelabel7、退......
  • 【渗透测试】Vulnhub Hackable II
    渗透环境攻击机:   IP: 192.168.216.129(Kali)靶机:     IP:192.168.216.131靶机下载地址:https://www.vulnhub.com/entry/hackable-ii,711/进行渗透一、获取端口信息该虚拟机导入VMware需要在拯救模式中重新配置一下网卡名称,附上教程,不再赘述:https://blog.csdn......
  • 11 IIC通讯协议
    目录前言一、IIC介绍1.IIC的时序2.使用IIC对从机寄存器的写操作流程3.使用IIC对从机寄存器的读操作流程二、软件实现IIC协议1.GPIO口配置2.IIC开始信号3.IIC结束信号4.发送数据5.接收数据6.接收ACK响应7.发送ACK和NACK响应8.对寄存器进行写处理9.对寄存器进行读处理三、硬件实现II......
  • .NET面试题系列(27)反射
    序言 应该场景数据库对象转实体 publicstaticList<T>TableToList<T>(DataTabletable)whereT:classORMAutoMapperSystem.TypeSystem.Type类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段......
  • 常见面试题问题及答案
    常见面试题问题及答案1、什么是API端点(APIendpoint)?说说相关技术点用于访问特定资源或功能的网络地址或URI,代表了API的一个具体操作或服务,并定义了客户端与服务器之间进行交互的方式;1:URI(统一资源标识符),包含了协议(如HTTP/HTTPS)、主机名、路径、查询参数等2:请求方法,GET(获......
  • Leetcode-552 学生出勤记录II
    Leetcode-552学生出勤记录II1.题目描述2.解题思路3.代码实现1.题目描述Leetcode-552学生出勤记录II2.解题思路(1)使用记忆化搜索来实现;(2)定义f[i][j][k]为右边填写j个A,且右边相邻位置有k个连续的L的情况下,向左填字母能构造多少个长为i的字符串;(3)对......
  • ASCII和Unicode区别
    ASCII和Unicode的主要区别在于它们的编码范围、长度、兼容性、支持的语言种类以及编码方式。‌编码范围和长度‌:ASCII编码只能表示128个字符,包括英文字母、数字和一些标点符号,每个字符占用一个字节。而Unicode编码可以表示几乎所有语言的字符,包括拉丁文、中文、日文等,每个......
  • 【面试题 02.07. 链表相交 简单】
    题目:同:160.链表相交给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例1......
  • 【142. 环形链表 II 中等】
    题目:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 2024年Java面试题最新整理
    一、Java基础部分面试题1.Java面向对象的三个特征封装:对象只需要选择性的对外公开一些属性和行为。继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。多态:允许不同类的对象对同一消息做出响应。篇幅限制下面就只能给大家展示小册部分内容......