[Golang]力扣Leetcode—剑指Offer—数组—53 - II. 0~n-1中缺失的数字(求和、二分法)

[Golang]力扣Leetcode—剑指Offer—数组—53 - II. 0~n-1中缺失的数字(求和、二分法)

题目:一个长度为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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的皮埃尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值