【科学刷题】取值小于n的n个数专题

这篇博客主要探讨了如何在数组中寻找缺失的第一个正数、消失的数字以及重复的数字。通过使用位运算和数学公式,如高斯求和和异或定理,有效地解决这类问题。文章提到了多个相似题目的解决方案,并鼓励读者将这些方法结合以深化理解。
摘要由CSDN通过智能技术生成

※ 41. 缺失的第一个正数

41. 缺失的第一个正数

缺失的第一个正数

这题的hash法我看懂了,就是没时间写注释

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            if nums[i] <= 0:
                nums[i] = n + 1
        for i in range(n):
            num = abs(nums[i])
            if num <= n:
                nums[num - 1] = -abs(nums[num - 1])
        for i in range(n):
            if nums[i] > 0:
                return i + 1
        return n + 1

448. 找到所有数组中消失的数字

复用上题的hash法

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        n=len(nums)
        for i in range(n):
            num=abs(nums[i])
            if num<=n:
                nums[num-1]=-abs(nums[num-1])
        ans=[]
        for i in range(n):
            if nums[i]>0:
                ans.append(i+1)
        return ans

268. 丢失的数字

缺失数字

  • 数学tricky

用求和公式求出 [ 0 ⋯ n ] [0\cdots n] [0n] 的和,减去数组中所有数的和,就得到了缺失数字

求和,题解用的高斯求和,有玩家认为会溢出,提出了以下方法:

    public int missingNumber(int[] nums) {
        int sum = 0;
        for (int i = 1; i <= nums.length; i++) {
            sum += i;
            sum -= nums[i - 1];
        }
        return sum;
    }
  • 位运算

先和 [ 0 ⋯ n ] [0\cdots n] [0n]的数都xor一遍,根据a ^ a = 0的定理,a ^ a ^ b = b ,就找到了

class Solution:
    def missingNumber(self, nums):
        missing = len(nums)
        for i, num in enumerate(nums):
            missing ^= i ^ num
        return missing

287. 寻找重复数

复用剑指的代码

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            nums[i] -= 1
        for i in range(n):
            while nums[i] != i:
                if nums[i] == nums[nums[i]]:
                    return nums[i] + 1
                t = nums[i]
                nums[i] = nums[t]
                nums[t] = t

剑指 Offer 03. 数组中重复的数字

在这里插入图片描述

和前面的一道题可以合起来看看

剑指 Offer 03. 数组中重复的数字

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            # 有一个顾虑,就是如果不存在数字i会出现死循环,
            # 但不用担心,如 [1, 1, 1] ,会直接返回掉
            while nums[i] != i:
                if nums[i] == nums[nums[i]]:
                    return nums[i]
                # ↓ 这么干就凉了
                # nums[i], nums[nums[i]] = nums[nums[i]], nums[i]
                tmp = nums[nums[i]]
                nums[nums[i]] = nums[i]
                nums[i] = tmp
        return -1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值