leecode 解题总结:41. First Missing Positive

来源:互联网 发布:可以看电视的软件 编辑:程序博客网 时间:2024/05/29 10:08
#include <iostream>#include <stdio.h>#include <vector>#include <set>using namespace std;/*问题:Given an unsorted integer array, find the first missing positive integer.For example,Given [1,2,0] return 3,and [3,4,-1,1] return 2.Your algorithm should run in O(n) time and uses constant space.分析:寻找首次丢失的整数,但是给定的数组可能含有0和负数。题目只能用O(n)时间,不能排序。应该是扫描一遍数组就算出答案。可以将不断扫描的数进行异或处理:比如: 1^2=3      1^3^4=0001 ^ 0011 ^ 0100 = 0010^0100=0110=6  和1^2^3^4=0110^0010=0100=4也就是说可以将数组中整数进行异或处理得到sum1,获取数组中最大整数n,对1到n也异或处理得到sum2,将sum1与sum2进行异或处理,得到的结果如果为0,那么丢失的数为n+1;否则,丢失的整数为sum1^sum2未能求解出输入:3(数组元素个数)1 2 0(数组所有元素)43 4 -1 121 121000 -121 2输出32213关键:1 解法:设定一种映射A[i] = i + 1,比如1对应A[0]。如果找到某个元素A[i],就将它和A[ A[i] -1 ]交换。        找到i从0开始找到第一个A[i] != i + 1的元素即可//交换,在数组长度允许的条件下,将位置不符合的元素进行交换if(1 <= value && value <= size && value != nums.at(value - 1)){swap(nums.at(i) ,nums.at(value - 1) );//每次交换后,当前位置不一定符合,所以i--,再重新计算一次i--;}2 //如果是空数组,返回1,等于丢失第一个整数if(nums.empty()){return 1;}3 如果数组中出现重复元素需要规避4 并不一定是最大数之前的元素都会出现*/class Solution {public:    int firstMissingPositive(vector<int>& nums) {//如果是空数组,返回1,等于丢失第一个整数if(nums.empty()){return 1;}int size = nums.size();//防止出现重复元素int value;for(int i = 0 ; i < size ; i++){//元素i+1在下标为i的位置上,则跳过if(nums.at(i) == i + 1){continue;}value = nums.at(i);//交换,在数组长度允许的条件下,将位置不符合的元素进行交换if(1 <= value && value <= size && value != nums.at(value - 1)){swap(nums.at(i) ,nums.at(value - 1) );//每次交换后,当前位置不一定符合,所以i--,再重新计算一次i--;}}//从头开始遍历for(int i = 0 ; i < size ; i++){if(nums.at(i) != (i + 1) ){return (i+1);}}//如果数组中元素都符合摆放,则说明是最后一个元素,数组长度+1return (size + 1);    }};void process(){Solution solution;int num;vector<int> nums;int value;while(cin >> num){nums.clear();for(int i = 0 ; i < num ; i++){cin >> value;nums.push_back(value);}int result = solution.firstMissingPositive(nums);cout << result << endl;}}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0
原创粉丝点击