leecode 解题总结:268. Missing Number

来源:互联网 发布:打印机的端口怎么看 编辑:程序博客网 时间:2024/06/04 00:20
#include <iostream>#include <stdio.h>#include <vector>#include <string>#include <unordered_map>using namespace std;/*问题:Given an array containing n distinct numbers taken from 0, 1, 2, ..., n,find the one that is missing from the array.For example,Given nums = [0, 1, 3] return 2.Note:Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?分析:给定一个n个不同的整数数组,寻找丢失的数。数字不同,可以用位图或者统计排序来做。可以先分组,比如将每个整数取100的余后,然后进行处理。需要先寻找最大的数,时间为线性时间复杂度=O(n)。这里用哈希map来做,就不是常量的空间了。如果用哈希,判断下一个数和上一个数是否相邻即可。等差数列判定:如果有3个数,按照道理0,1,2diff(0~n)=(n+1)*n/2,,计算数组所有元素的和为sum,用(n+1)*n/2 - sum 即为丢失的数输入:30 1 330 1 21011输出:2310关键:1 给定n个元素,实际有n+1个元素,丢失了一个,实际元素是:0,1,2,3...,n,实际的和是n(n+1)/2,现在n个元素的和为sum,丢失的数=(n+1)*n/2 - sum*/class Solution {public:    int missingNumber(vector<int>& nums) {        if(nums.empty()){return 0;}int size = nums.size();int sum = 0;for(int i = 0 ; i < size ; i++){sum += nums.at(i);}//长度为size ,因为丢失一个数,真正长度为size + 1,但又是从0开始,需要减去1,等差数列的和为=(size-1)*size/2int result = (size + 1) * size / 2;int missNumber = result - sum;return missNumber;    }};void print(vector<int>& result){if(result.empty()){cout << "no result" << endl;return;}int size = result.size();for(int i = 0 ; i < size ; i++){cout << result.at(i) << " " ;}cout << endl;}void process(){ vector<int> nums; int value; int num; Solution solution; vector<int> result; while(cin >> num ) { nums.clear(); for(int i = 0 ; i < num ; i++) { cin >> value; nums.push_back(value); } int answer = solution.missingNumber(nums); cout << answer << endl; }}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0