LeetCode-Find_All_Numbers_Disappeared_in_an_Array

题目:

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;
}


猜你喜欢

转载自blog.csdn.net/tel_annie/article/details/80393444
今日推荐