关于golang:Golang力扣Leetcode剑指Offer数组53-II-0~n1中缺失的数字求和二分法

46次阅读

共计 1006 个字符,预计需要花费 3 分钟才能阅读完成。

题目 :一个长度为 n - 1 的递增排序数组中的所有数字都是惟一的,并且每个数字都在范畴 0~n- 1 之内。在范畴 0~n- 1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。

链接 :力扣 Leetcode—剑指 Offer—数组—53 – II. 0~n- 1 中缺失的数字.

示例 1:

输出: [0,1,3]
输入: 2

示例 2:

输出: [0,1,2,3,4,5,6,7,9]
输入: 8

思路

  1. 法一:求出 0-n 的和 sum,再求出给定数组的和,一减就是 0-n 中缺失的数字
  2. 法二:二分法

    • 初始化:左边界 left = 0,右边界 right = len(nums) – 1;代表闭区间 [i, j]。
    • 循环二分:当 i ≤ j 时循环(即当闭区间 [i, j] 为空时跳出);计算中点 mid = (i + j) / 2
    • 若 nums[mid] = mid,则“右子数组的首位元素”肯定在闭区间 [mid + 1, j] 中,因而执行 left = mid + 1;
    • 若 nums[mid] != mid,则“左子数组的末位元素”肯定在闭区间 [i, mid – 1] 中,因而执行 right = mid – 1;
    • 返回值:跳出时,变量 i 和 j 别离指向“右子数组的首位元素”和“左子数组的末位元素”。因而返回 i 即可。

法一代码:

package main

import "fmt"

func missingNumber(nums []int) int {n := len(nums)
    sum := n * (n + 1) / 2
    for i := 0; i < n; i++ {sum -= nums[i]
    }
    return sum
}

func main() {a := []int{0, 1, 2, 3, 4, 5, 6, 7, 9}
    fmt.Println(missingNumber(a))
}

提交截图

法二代码:

package main

import "fmt"

func missingNumber(nums []int) int {
    left := 0
    right := len(nums) - 1
    for left <= right {mid := (left + right) / 2
        if nums[mid] != mid {
            //nums 是有序数组,如果 mid 和数字不雷同就在右边查找
            right = mid - 1
        } else {
            // 如果 mid 和数字雷同,阐明右边是间断的有序数组
            // 缺失的数字就在左边查找,left 向上取整 +1
            left = mid + 1
        }
    }
    return left
}

func main() {a := []int{0, 1, 2, 3, 4, 5, 6, 7, 9}
    fmt.Println(missingNumber(a))
}

提交截图

正文完
 0