41. 缺失的第一个正数
1 // 给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 2 // 示例 1 : 3 // 输入 : [ 1, 2, 0 ] 输出 : 3 示例 2 : 4 // 输入 : [ 3, 4, -1, 1 ] 输出 : 2 示例 3 : 5 // 输入 : [ 7, 8, 9, 11, 12 ] 输出 : 1 6 // leetcode-cn.com/problems/first-missing-positive 7 8 #include <iostream> 9 #include <vector> 10 11 class Solution { 12 public: 13 int firstMissingPositive(std::vector<int>& nums) { return method1(nums); } 14 15 // 思路一: 16 // 新建一个tmp数组,长度为nums.size(),默认值为0 17 // 遍历nums数组,对每个数组放在其对应的位置,如果超出了,则丢弃 18 // 遍历tmp数组,找到第一个为0的,则说明是答案 19 int method1(std::vector<int>& nums) { 20 std::vector<int> tmp(nums.size(), 0); 21 for (int i = 0; i < nums.size(); ++i) { 22 if (nums[i] > 0 && nums[i] <= nums.size()) { 23 tmp[nums[i] - 1] = nums[i]; 24 } 25 } 26 27 for (int i = 0; i < tmp.size(); ++i) { 28 if (tmp[i] == 0) { 29 return i + 1; 30 } 31 } 32 33 return nums.size() + 1; 34 } 35 36 // 思路二: 37 // 对思路一进行改进 38 // 使用in-place方案 39 // 对每个nums中的元素进行如下措施保证“有序” 40 // 对nums[i],将nums[i]放在nums[nims[i] - 1]上, 41 // 知道nums[i]越界,或者nums[nums[i] - 1]的数是正确的 42 int method2(std::vector<int>& nums) { 43 for (int i = 0; i < nums.size(); ++i) { 44 while (nums[i] > 0 && nums[i] <= nums.size() && 45 nums[i] != nums[nums[i] - 1]) { 46 std::swap(nums[i], nums[nums[i] - 1]); 47 } 48 } 49 50 for (int i = 0; i < nums.size(); ++i) { 51 if (nums[i] != i + 1) { 52 return i + 1; 53 } 54 } 55 56 return nums.size() + 1; 57 } 58 }; 59 60 int main(int argc, char* argv[]) { 61 std::vector<int> vec({4, 2, 1, 3}); 62 Solution so; 63 std::cout << so.method2(vec) << std::endl; 64 return 0; 65 }