当前位置: 首页 > news >正文

【面试必刷TOP101】寻找峰值 数组中的逆序对

目录

题目:寻找峰值_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

题目:数组中的逆序对_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:寻找峰值_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func findPeakElement( nums []int ) int {
    // write code here
}

解题思路:

首先补充一句:这道题的自测有问题不要信,逻辑正确就直接提交就好。

这道题也是一道很经典的二分题目,二分并不是一定要有序的数组才能使用二分,二分的精髓在于数据的单调性,二分就是通过数据的单调性,以及寻找一个参照物来快速排除一部分的数据,

就拿这道题来说,题目要求是无论返回哪个山峰都行,那我们只有两种情况需要考虑,一个是在山峰的左边(递增区间)一个是在山峰的右边(递减区间),如果是在递增区间,我们就可以把左边的数据排除,如果是在递减区间,我们就能将右边连同自己这段数据排除,这样就使用到了二分的思想,代码如下

代码:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func findPeakElement( nums []int ) int {
    left, right := 0, len(nums)-1
    for left < right {
        mid := left + (right - left + 1) / 2
        if nums[mid] > nums[mid-1] {
            left = mid
        } else {
            right = mid-1
        }
    }
    return left
}

过啦!!!

题目:数组中的逆序对_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型
*/
func InversePairs( nums []int ) int {
    // write code here
}

解题思路:

这道题目的如果使用暴力求解那肯定就是 O(N) 基本的时间复杂度,想要做到 N*logN 就得想其他的解决方案,这道题也算是一道非常经典的题目,考察的是归并排序的写法

我们通过使用归并排序的思想就可以在使用归并排序的过程中完成题目的要求,代码如下

代码:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组
 * @return int整型
 */
func InversePairs(nums []int) int {
	if len(nums) < 2 {
		return 0
	}

	count := 0
    var mergeSort func(left, right int)
    var merge func(left, right, mid int)

	mergeSort = func(left, right int) {
		if left >= right {
			return
		}

		mid := left + (right-left)/2
		mergeSort(left, mid)
		mergeSort(mid+1, right)
		merge(left, right, mid)
	}

	merge = func(left, right, mid int) {
		l, r := left, mid+1
		res := make([]int, right-left+1)
		index := 0
		for l <= mid && r <= right {
			if nums[l] <= nums[r] {
				res[index] = nums[l]
				l++
				index++
			} else {
				res[index] = nums[r]
				r++
				index++

				count += mid + 1 - l
				count %= 1000000007
			}
		}

		for l <= mid {
			res[index] = nums[l]
			index++
			l++
		}
		for r <= right {
			res[index] = nums[r]
			index++
			r++
		} 
		l = left
		for _, v := range res {
			nums[l] = v
			l++
		}
	}

	mergeSort(0, len(nums)-1)
	return count
}

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章:

  • ARM/X86工控机在轨道交通交通管理系统的应用(4)
  • 实现注册手机号用户
  • JDK21新特性 有序集合
  • C语言字符和字符串函数(2)
  • 最新ChatGPT网站系统源码+支持GPT4.0+支持AI绘画Midjourney绘画+支持国内全AI模型
  • RHCE---Linux的计划任务
  • Docker网络+资源控制
  • 【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
  • React Hooks使用经验以及技巧
  • 时间轮算法
  • Python 编程基础 | 第一章-预备知识 | 1.4、包管理工具
  • 网络安全——黑客(自学)
  • 【牛客网】排序子序列
  • 算法 括号生成-(递归回溯+同向双指针)
  • 解决仪器掉线备忘
  • 希望杯、希望数学系列竞赛辨析和希望数学超1G的真题和学习资源
  • 邮件功能-python中的SMTP协议邮件发送
  • Ubuntu Postgresql开机自启动服务
  • 在北京多有钱能称为富
  • ubuntu20.04 安装 pyconcorde
  • 来论|受美国“保护”,日本民众要付出什么代价?
  • 结婚这件事,年轻人到底怎么想的?
  • 零食连锁鸣鸣很忙递表港交所:去年营收393亿元,门店超1.4万家,净利润率2.1%
  • 俄罗斯纪念卫国战争胜利80周年阅兵式首次彩排在莫斯科举行
  • 新造古镇丨上海古镇朱家角一年接待164万境外游客,凭啥?
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”