热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Golang]力扣Leetcode—中级算法—排序和搜索—寻找峰值(二分法)

[Golang]力扣Leetcode—中级算法—排序和搜索—寻找峰值(二分法)-题目:峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。

题目
峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现 时间复杂度为 O(log n) 的算法来解决此问题。

链接: 力扣Leetcode—中级算法—排序和搜索—寻找峰值.

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5
解释:你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。

标签:数组、二分查找

思路:本题首先最容易想到的就是遍历数组,找出第一个符合条件的元素就可以了,这很简单,但是不满足O(logN)的时间复杂度要求

那么我们想要满足O(logN)的时间复杂度要求,那么肯定就是采用二分法

二分法:

  • 定义高低两个指针low,high,分别指向数组首位
  • 定义中间指针mid=(low+high)/2我们知道二分法的结束标志是low>=high,当low==high的时候,算法肯定结束
  • 然后我们每次判断中间值,如果中间值处于下降状态,那么可以肯定中间值的左边有比中间值大的数,而数组两头又是非常小的数,所以峰值肯定在左边,所以我们二分法的下一次开始就是让high=mid
  • 如果中间值处于上升状态,那么峰值肯定就在中间值的右边,所以二分法的下一次开始就是让low=mid+1
  • 你需要仔细感受high=mid和low=mid+1这两个等式,揣摩细微之处,可以发现low随着mid移动,而high最多等于mid,仔细揣摩他们的区别

全部Go代码如下:

package main

import "fmt"

//二分法
func findPeakElement(nums []int) int {
    low, high := 0, len(nums)-1
    for low  nums[mid+1] {
            high = mid
        } else {
            low = mid + 1
        }
    }
    return low
}

func main() {
    a := []int{1, 2, 3, 1}
    fmt.Println(findPeakElement(a))
}

提交截图

这里我也写一下遍历:

全部Go代码如下:

package main

import "fmt"

//遍历
func findPeakElement(nums []int) int {
    var max int
    n := len(nums)
    // 数组长度为1,那第一个就是最大,位置为0
    if n == 1 {
        max = 0
    } else if n == 2 {
    // 数组长度为2,比较一下,如果第2个大于第1个,位置1为最大,其他都是位置0最大
        if nums[1] > nums[0] {
            max = 1
        } else {
            max = 0
        }
    } else if n > 2 {
    // 数组长度大于2,遍历数组,如果有大于左边并且大于右边的,记下位置并且跳出遍历
        for i := 1; i  nums[i+1] {
                max = i
                break
            } else if nums[1]  nums[0] {
                max = n - 1
                // 第二个数大,那位置n-1就是最大的
            }
        }
    }
    return max
}

func main() {
    a := []int{1, 2, 3, 1}
    fmt.Println(findPeakElement(a))
}

提交截图


推荐阅读
  • 认真一点学 Go:18. 并发
    收录于《Go基础系列》,作者:潇洒哥老苗。>>原文链接学到什么并发与并行的区别?什么是Goroutine?什么是通道?Goroutine如何通信?相关函数的使用?sel ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义 ... [详细]
  • 小编给大家分享一下Golang端口复用测试的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 七、Golang之切片(slice)-由于数组的长度是固定的,所以有很多的局限性,所以今天讲切片,切片是一个拥有相同类型且长度可变的有序集合,切片和数组两种不同的数据类型,它是基于 ... [详细]
author-avatar
l彡id夏日阳光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有