国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

leecode 解題總結(jié):41. First Missing Positive

2019-11-09 20:10:13
字體:
供稿:網(wǎng)友
#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.分析:尋找首次丟失的整數(shù),但是給定的數(shù)組可能含有0和負數(shù)。題目只能用O(n)時間,不能排序。應(yīng)該是掃描一遍數(shù)組就算出答案。可以將不斷掃描的數(shù)進行異或處理:比如: 1^2=3      1^3^4=0001 ^ 0011 ^ 0100 = 0010^0100=0110=6	  和1^2^3^4=0110^0010=0100=4也就是說可以將數(shù)組中整數(shù)進行異或處理得到sum1,獲取數(shù)組中最大整數(shù)n,對1到n也異或處理得到sum2,將sum1與sum2進行異或處理,得到的結(jié)果如果為0,那么丟失的數(shù)為n+1;否則,丟失的整數(shù)為sum1^sum2未能求解出輸入:3(數(shù)組元素個數(shù))1 2 0(數(shù)組所有元素)43 4 -1 121 121000 -121 2輸出32213關(guān)鍵:1 解法:設(shè)定一種映射A[i] = i + 1,比如1對應(yīng)A[0]。如果找到某個元素A[i],就將它和A[ A[i] -1 ]交換。        找到i從0開始找到第一個A[i] != i + 1的元素即可	//交換,在數(shù)組長度允許的條件下,將位置不符合的元素進行交換	if(1 <= value && value <= size && value != nums.at(value - 1))	{		swap(nums.at(i) ,nums.at(value - 1) );		//每次交換后,當(dāng)前位置不一定符合,所以i--,再重新計算一次		i--;	}2 		//如果是空數(shù)組,返回1,等于丟失第一個整數(shù)		if(nums.empty())		{			return 1;		}3 如果數(shù)組中出現(xiàn)重復(fù)元素需要規(guī)避4 并不一定是最大數(shù)之前的元素都會出現(xiàn)*/class Solution {public:    int firstMissingPositive(vector<int>& nums) {		//如果是空數(shù)組,返回1,等于丟失第一個整數(shù)		if(nums.empty())		{			return 1;		}		int size = nums.size();		//防止出現(xiàn)重復(fù)元素		int value;		for(int i = 0 ; i < size ; i++)		{			//元素i+1在下標(biāo)為i的位置上,則跳過			if(nums.at(i) == i + 1)			{				continue;			}			value = nums.at(i);			//交換,在數(shù)組長度允許的條件下,將位置不符合的元素進行交換			if(1 <= value && value <= size && value != nums.at(value - 1))			{				swap(nums.at(i) ,nums.at(value - 1) );				//每次交換后,當(dāng)前位置不一定符合,所以i--,再重新計算一次				i--;			}		}		//從頭開始遍歷		for(int i = 0 ; i < size ; i++)		{			if(nums.at(i) != (i + 1) )			{				return (i+1);			}		}		//如果數(shù)組中元素都符合擺放,則說明是最后一個元素,數(shù)組長度+1		return (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;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西充县| 眉山市| 五寨县| 永济市| 阳江市| 广河县| 安庆市| 台东县| 安阳市| 石城县| 绥芬河市| 磐安县| 中江县| 镇远县| 锡林郭勒盟| 翁牛特旗| 友谊县| 嘉善县| 内丘县| 台中市| 获嘉县| 卓资县| 阿城市| 泌阳县| 铜山县| 炎陵县| 罗定市| 寻乌县| 横峰县| 洛扎县| 抚宁县| 绩溪县| 双鸭山市| 龙口市| 余干县| 乐亭县| 勐海县| 上杭县| 临洮县| 锡林郭勒盟| 北海市|