当前位置: 首页 > 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
  • 神舟二十号全系统合练今日展开
  • 喝水呛咳?帕金森患者的吞咽障碍看这一篇就够了
  • 红十字国际委员会加沙地带办公场所再次遭袭
  • 杨小伟被查,国家广播电视总局党组:坚决拥护党中央决定
  • 上海不重视民企?专家:此次26项措施消除了误会,信心比黄金重要
  • 习近平会见马来西亚最高元首:开启中马关系新的“黄金50年”