首页 > 其他分享 >leetCode 33:搜索旋转排序数组

leetCode 33:搜索旋转排序数组

时间:2025-01-04 13:14:49浏览次数:1  
标签:target nums 33 mid int 数组 排序 leetCode left

题目:

整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:
输入:nums = [1], target = 0
输出:-1

思路

这道二分查找,非常高频,可以多练习下。

  • 二分查找,循环条件一般是 left <= right
  • 找到了目标数据,就返回下标
  • 因为原本的数组就是有序的,将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。
    按照 【0, mid) , 【mid, right) 的区间 划分。

代码

    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }
        int left = 0;
        int right = n - 1;

        // 左边界比右边界小, 不断迭代,最后结束循环
        while (left <= right) {
            int mid = (left + right) / 2;
            //注意:找到了目标数据,就返回下标
            if (nums[mid] == target) {
                return mid;
            }

            // 因为原本的数组就是有序的,将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。
            if (nums[0] <= nums[mid]) {
                // 如果 落在 【0, mid) 的区间
                if (nums[0] <= target && target < nums[mid]) {
                    // 调整 右边距
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }

            } else {
                // 如果 落在 【mid, right) 的区间
                if (nums[right] >= target && target > nums[mid]) {
                    // 调整 左边距
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }

            }

        }
        return -1;
    }


标签:target,nums,33,mid,int,数组,排序,leetCode,left
From: https://www.cnblogs.com/expiator/p/18651783

相关文章

  • LeetCode 64. 最小路径和
    题目:64.最小路径和给定一个包含非负整数的mxn网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。思路:多维的动态规划。最小路径和,当前格子的步数是固定的,走到上一步的路径和取小的。当前格子的步数是固定的......
  • LeetCode118.杨辉三角
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:输入:numRows=5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例2:输入:numRows=1输出:[[1]]思路:当前的值,等于左上角加上正上方。代码:publicLi......
  • LeetCode136.只出现一次的数字
    题目给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。示例1:输入:nums=[2,2,1]输出:1示例2:输入:nums=[4,1,2,1,2]输出:4......
  • LeetCode169.多数元素
    题目:给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于[n/2]的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:nums=[3,2,3]输出:3示例2:输入:nums=[2,2,1,1,1,2,2]输出:2思路:哈希法遍历数组,通过map统计数量,k......
  • leetCode121.买卖股票的最佳时机
    题目:给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。示例......
  • LeetCode 762[二进制表示中质数个计算置位]
    题目链接LeetCode762[二进制表示中质数个计算置位]详情实例提示题解思路两个条件:1、二进制位为12、满足条件1的个数为质数  首先for循环遍历区间for(inti=left;i<right+1;i++){intiCount=0;//二进制位为1的个数......
  • leetcode12.整数转罗马数字
    Python3:classSolution:defintToRoman(self,num:int)->str:#初始化字典val={1000:"M",900:"CM",500:"D",400:"CD",100:"C&quo......
  • STM32-笔记33-Wi-Fi遥控风扇项目
    一、项目简介        电脑通过esp8266模块远程遥控风扇。PC端的网络调试助手(以服务端的模式连接客户端的esp8266)二、项目实现复制项目文件36-编程实现ESP8266连接TCP服务器重命名为:38-wifi控制风扇项目重命名为fan加载文件main.c#include"sys.h"#includ......
  • js的方法sort默认是按什么方式排序的?
    在JavaScript中,Array.prototype.sort()方法用于对数组的元素进行排序。然而,sort()方法的默认排序方式并不是纯数字排序,而是将数组元素转换为字符串,然后基于字符的Unicode码点进行排序。这意味着,如果你有一个数字数组并直接使用sort()方法,你可能会得到非预期的结果。例如:cons......
  • 写一个方法对数组对象的某几个key进行排序
    在前端开发中,JavaScript是一种常用的语言,我们可以使用其数组的sort()方法来对数组对象的特定key进行排序。以下是一个简单的示例,假设我们有一个对象数组,并且我们想要根据对象的agekey对其进行排序:functionsortByKey(array,key){returnarray.sort((a,b)=>(a[k......