2021-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了
2021-09-26:搜索旋转排序数组。整数数组 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 。力扣33。
福大大 答案2021-09-26:
二分法。
 时间复杂度:O(logN)。极端情况下是O(N)。
 空间复杂度:O(1)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
    arr := []int{4, 5, 6, 7, 0, 1, 2}
    num := 0
    ret := search(arr, num)
    fmt.Println(ret)
}
// arr,原本是有序数组,旋转过,而且左部分长度不知道
// 找num
// num所在的位置返回
func search(arr []int, num int) int {
    L := 0
    R := len(arr) - 1
    M := 0
    for L <= R {
        // M = L + ((R - L) >> 1)
        M = (L + R) / 2
        if arr[M] == num {
            return M
        }
        // arr[M] != num
        // [L] == [M] == [R] != num 无法二分
        if arr[L] == arr[M] && arr[M] == arr[R] {
            for L != M && arr[L] == arr[M] {
                L++
            }
            // 1) L == M L...M 一路都相等
            // 2) 从L到M终于找到了一个不等的位置
            if L == M { // L...M 一路都相等
                L = M + 1
                continue
            }
        }
        // ...
        // arr[M] != num
        // [L] [M] [R] 不都一样的情况, 如何二分的逻辑
        if arr[L] != arr[M] {
            if arr[M] > arr[L] { // L...M 一定有序
                if num >= arr[L] && num < arr[M] { //  3  [L] == 1    [M]   = 5   L...M - 1
                    R = M - 1
                } else { // 9    [L] == 2    [M]   =  7   M... R
                    L = M + 1
                }
            } else { // [L] > [M]    L....M  存在断点
                if num > arr[M] && num <= arr[R] {
                    L = M + 1
                } else {
                    R = M - 1
                }
            }
        } else { /// [L] [M] [R] 不都一样,  [L] === [M] -> [M]!=[R]
            if arr[M] < arr[R] {
                if num > arr[M] && num <= arr[R] {
                    L = M + 1
                } else {
                    R = M - 1
                }
            } else {
                if num >= arr[L] && num < arr[M] {
                    R = M - 1
                } else {
                    L = M + 1
                }
            }
        }
    }
    return -1
}
执行结果如下:
 
2021-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了的更多相关文章
- 【每日一题】【比较中右,内部比较中右,注意边界带>=】2021年11月2日-搜索旋转排序数组-211102/220211
		
[某下标处进行了旋转]整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋 ...
 - [LeetCode每日一题]81. 搜索旋转排序数组 II
		
[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...
 - 【LeetCode】81. 搜索旋转排序数组 II
		
81. 搜索旋转排序数组 II 知识点:数组,二分查找: 题目描述 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 ...
 - 81. 搜索旋转排序数组 II
		
题目 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋 ...
 - LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组  python实现
		
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
 - LeetCode HOT 100:搜索旋转排序数组
		
题目:33. 搜索旋转排序数组 题目描述: 一个整数数组,数组每个值都不相同,且该整数数组是一个被旋转过的数组.被旋转过的数组是指,由一个递增的数组,从某一个下标开始往后的元素,移到最开头.举个例子: ...
 - [Swift]LeetCode81. 搜索旋转排序数组 II | Search in Rotated Sorted Array II
		
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
 - LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
		
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ...
 - 【1】【leetcode-33,81】 搜索旋转排序数组
		
(没思路) 33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给 ...
 - LeetCode(81): 搜索旋转排序数组 II
		
Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...
 
随机推荐
- Docker-界面化
			
docker-ui docker-ui只能便于我们查看系统的相关信息,镜像或者容器.在界面上做简单的处理,可处理单机版Docker. docker pull uifd/ui-for-docker do ...
 - C++编码注意事项
			
1. vector,string不能按位赋值(vector用push_back, string用重载"+"号)
 - 利用MRT批量处理MOD13Q1原始数据拼接的方法
			
一.在存放原始数据的文件夹里,新建立一个result文件夹.新拼接的文件夹处理过后会在这个文件夹里出现 二.利用MRT点点点保存一个prm文件在存放原始数据的文件夹里 具体操作步骤参考 青灯常伴古佛 ...
 - Win32窗口设置为透明
			
可以使用以下方法将Win32窗口设置为透明: 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL. 在窗口创建时,使用WS_EX_LAYERED风格和SetLay ...
 - DVWA-File Inclusion(文件包含)
			
文件包含漏洞,当我们在一个代码文件想要引入.嵌套另一个代码文件的时候,就是文件包含. 常见的文件包含函数有include require等函数. 这两个函数的区别就是include在包含文件不存在时p ...
 - Linux & 标准C语言学习 <DAY12_1>
			
10.函数指针 函数名就是一个地址(整数),代表了该函数在代码段中的位置 函数指针就是专门指向某种函数的指针,它里面存储的是该函数在代码段中的位置(函数名) ...
 - Java项目是不是分布式,真有那么重要吗?
			
大家好,我是3y啊. 大概不知道从什么时候,「微服务」「分布式」这两个词又再次频繁出现在我的视线里. 「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了 ...
 - 创建镜像发布到镜像仓库【不依赖docker环境】
			
image 工具背景 如今,docker镜像常用于工具的分发,demo的演示,第一步就是得创建docker镜像.一般入门都会安装docker,然后用dockerFile来创建镜像,除此以外你还想过有更 ...
 - [Git/GitLab]使用SSH远程登录GitLab/GitHub
			
1 前言 近日,换了台新电脑. 今日,正要更新(git pull)GitLab的源码时,在配置(用户名,邮箱,密码git config --global -l)完全无误的情况下,却报出如下错误: $ ...
 - 3.@RequestParma和@PathVariable的用法和区别
			
前言 我相信很多程序员都会在自己的项目中使用到Restful风格来安全便捷地进行接口的编写,因此本文这篇博客来简要介绍一下controller方法中的两个注解:@RequestParma和@PathV ...