题解 | #牛牛的旋转搜索#

牛牛的旋转搜索

https://www.nowcoder.com/practice/7ddbbc6318644fc18607b982ea4dc3d3?tpId=363&tqId=10615049&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D363

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型一维数组
     * @param target int整型
     * @return int整型
     */
    public int search(int[] arr, int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }

        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // 如果中间元素等于目标
            if (arr[mid] == target) {
                // 继续向左搜索最小的索引
                while (mid > 0 && arr[mid - 1] == target) {
                    mid--;
                }
                return mid;
            }

            // 如果中间元素大于左边界元素,说明左半部分是有序的
            if (arr[mid] > arr[left]) {
                // 如果目标在左半部分有序数组中,更新右边界为 mid - 1
                if (target >= arr[left] && target < arr[mid]) {
                    right = mid - 1;
                } else {
                    // 否则更新左边界为 mid + 1
                    left = mid + 1;
                }
            } else if (arr[mid] <
                       arr[left]) { // 如果中间元素小于左边界元素,说明右半部分是有序的
                // 如果目标在右半部分有序数组中,更新左边界为 mid + 1
                if (target > arr[mid] && target <= arr[right]) {
                    left = mid + 1;
                } else {
                    // 否则更新右边界为 mid - 1
                    right = mid - 1;
                }
            } else { // 如果中间元素等于左边界元素,无法判断哪一部分是有序的
                // 缩小搜索范围,去掉左边界元素
                left++;
            }
        }

        return -1; // 没有找到目标元素
    }
}

本题知识点分析:

1.二分查找

2.数组遍历

3.数学模拟

本题解题思路分析:

1.如果中间元素等于目标,继续向左搜索最小的索引

2.如果中间元素大于左边界元素,说明左半部分是有序的

3.如果中间元素小于左边界元素,说明右半部分是有序的

4.然后就是分别判断目标是在左半区域还是右半区域

5.如果没有找到目标数组就返回-1

本题属于纯数学模拟+一点二分查找,你要跟别人解释其实也就那样,看了题解就恍然大悟,属于背题类

本题使用编程语言: Java

如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~

全部评论

相关推荐

不愿透露姓名的神秘牛友
05-29 15:00
教授A:“你为什么要讲这么久,是要压缩我们对你的评议时间吗?你们别以为这样就能够让我们对你们少点意见。”&nbsp;“从你的发言和论文格式就能知道你的性格啊。”…….&nbsp;感觉被狠狠霸凌了。
码农索隆:“教授您好,首先我想回应您提出的两点疑问。” “关于我讲解时间较长的问题:这绝非为了压缩各位老师的评议时间。这份毕业设计是我过去几个月倾注了全部心血的作品,从构思、实验、调试到撰写,每一个环节都反复打磨。我深知时间宝贵,所以选择详细讲解,是希望能更完整、清晰地展示它的核心创新点、实现过程和验证结果,确保老师们能充分理解它的价值和我的努力。我完全理解并重视评审环节的意义,也做好了充分准备来听取各位老师的专业意见和批评。几个月的研究都坚持下来了,我怎么可能害怕老师们的点评呢?今天站在这里,正是抱着虚心学习、诚恳求教的态度而来。” “如果我的展示确实超时,影响了后续流程,烦请老师们随时示意,我会立刻调整。我非常期待并预留了充足的时间,希望能听到老师们宝贵的建议和深入的讨论。” “其次,关于您提到‘从发言和论文格式就能知道我的性格’。教授,我对此感到非常困惑和不安。学术研究和答辩的核心,难道不应该是作品本身的质量、逻辑的严谨性、数据的可靠性和结论的合理性吗?论文格式有明确的规范要求,我尽最大努力遵循了这些规范。如果格式上存在疏忽或不足,这属于技术性、规范性的问题,恳请老师们具体指出,我一定认真修改。但将格式问题或个人表达风格(如讲解时长)直接上升为对个人性格的评判,甚至以此作为质疑我学术态度和动机的依据,这让我感到非常不公平,也偏离了学术评议应有的客观和严谨原则。” “我尊重每一位评审老师的专业权威,也衷心希望能得到老师们对我的工作内容本身的专业指导和批评指正。任何基于研究本身的意见,无论多么尖锐,我都会认真聆听、反思并改进。但我恳请老师们,能将评议的焦点放在我的研究本身,而不是对我个人进行主观的推断或评价。谢谢各位老师。”
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务