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


    目录

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

    题目的接口:

    解题思路:

    代码:

    过啦!!!

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

    题目的接口:

    解题思路:

    代码:

    过啦!!!

    写在最后:


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

    题目的接口:

    1. package main
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. func findPeakElement( nums []int ) int {
    10. // write code here
    11. }

    解题思路:

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

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

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

    代码:

    1. package main
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. func findPeakElement( nums []int ) int {
    10. left, right := 0, len(nums)-1
    11. for left < right {
    12. mid := left + (right - left + 1) / 2
    13. if nums[mid] > nums[mid-1] {
    14. left = mid
    15. } else {
    16. right = mid-1
    17. }
    18. }
    19. return left
    20. }

    过啦!!!

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

    题目的接口:

    1. package main
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. func InversePairs( nums []int ) int {
    10. // write code here
    11. }

    解题思路:

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

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

    代码:

    1. package main
    2. /**
    3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    4. *
    5. *
    6. * @param nums int整型一维数组
    7. * @return int整型
    8. */
    9. func InversePairs(nums []int) int {
    10. if len(nums) < 2 {
    11. return 0
    12. }
    13. count := 0
    14. var mergeSort func(left, right int)
    15. var merge func(left, right, mid int)
    16. mergeSort = func(left, right int) {
    17. if left >= right {
    18. return
    19. }
    20. mid := left + (right-left)/2
    21. mergeSort(left, mid)
    22. mergeSort(mid+1, right)
    23. merge(left, right, mid)
    24. }
    25. merge = func(left, right, mid int) {
    26. l, r := left, mid+1
    27. res := make([]int, right-left+1)
    28. index := 0
    29. for l <= mid && r <= right {
    30. if nums[l] <= nums[r] {
    31. res[index] = nums[l]
    32. l++
    33. index++
    34. } else {
    35. res[index] = nums[r]
    36. r++
    37. index++
    38. count += mid + 1 - l
    39. count %= 1000000007
    40. }
    41. }
    42. for l <= mid {
    43. res[index] = nums[l]
    44. index++
    45. l++
    46. }
    47. for r <= right {
    48. res[index] = nums[r]
    49. index++
    50. r++
    51. }
    52. l = left
    53. for _, v := range res {
    54. nums[l] = v
    55. l++
    56. }
    57. }
    58. mergeSort(0, len(nums)-1)
    59. return count
    60. }

    过啦!!!

    写在最后:

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

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

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

  • 相关阅读:
    UIView和VC的生命周期
    解决动态菜单router的index配置,以及第二次传参未响应情况
    基于 Node.js 的文件管理系统(附源码)
    [ACNOI2022]不猜不行
    具有自适应调整策略的混沌灰狼优化算法-附代码
    常用射频接头之2.92mm
    Pod和容器设计模式
    贪心算法(一)
    C语言编写 输出[m,n]范围内所有“韩信点兵“数。
    Docker 数据管理
  • 原文地址:https://blog.csdn.net/Locky136/article/details/133279344