LeetCode-Find_All_Numbers_Disappeared_in_an_Array

本文介绍了一种在O(n)运行时间内查找指定范围内未出现在数组中的数字的方法,并提供了一个C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]


翻译:

给定一个数组,其中 1 ≤ a[i] ≤ n ( n =数组大小),其中一些元素出现两次,而其他的出现一次。

找到在 [1, n范围内没有出现在这个数组的元素。

你能解决它不用额外的空间并且在 O(n时间内吗?你可以假设返回的列表不被记为额外空间。

例子:

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]


思路:

调整元素的位置到对应的下标,例如a[1]=1,a[2]=2 ...,然后从头扫描,若下标与值对应不上,则说明该下标位置元素缺失。


C++代码(Visual Studio 2017):

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
	vector<int> findDisappearedNumbers(vector<int>& nums) {
		vector<int> result;
		for (int i = 0; i < nums.size(); i++) {
			if (nums[i] != nums[nums[i] - 1]) {
				swap(nums[i], nums[nums[i] - 1]);
				i--;
			}
		}
		for (int i = 0; i < nums.size(); i++) {
			if (nums[i] != i + 1)
				result.push_back(i + 1);
		}
		return result;
	}
};

int main()
{
	Solution s;
	vector<int> nums = { 4,3,2,7,8,2,3,1 };
	vector<int> result;
	result = s.findDisappearedNumbers(nums);
	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值