LeetCode:41. First Missing Positive

41. First Missing Positive

  • 题目
    • Given an unsorted integer array, find the smallest missing positive integer.

    • Example:

      Input: [7,8,9,11,12]
      Output: 1
      
    • Note: Your algorithm should run in O(n) time and uses constant extra space.

  • 解题思路
    • 本题的题意比较容易理解,即寻找一个无序的数组里面找到一个最小缺失的正整数
    • 第一想法是将无序数组进行排序,然后遍历一遍排好序的数组即可找出最小缺失的正整数,但是排序算法最优解的时间复杂度都为O(nlogn),显然不能满足题目的时间复杂度要求
    • 其次的主要想法就是利用数组的下标,因为下标是从0开始的,不断累增的数列,并且除0外都是正整数
      • 遍历数组,将当前元素交换到其减一后作为下标的位置,即nums[i]nums[nums[i] - 1]进行交换,即将1放到数组0号位,将2放到数组1号位,依此类推。这个步骤比较关键,其中小坑也比较多,有些是提交了才发现的
        • 交换条件的选择,可能被交换的元素必须要满足> 0&&< array.size&&nums[i] != nums[nums[i] - 1],其中最后一个条件是避免两个位置不断的执行交换,例如输入[1,1]的情况,造成死循环
        • 循环变量的控制,当需要交换的时候需要将循环变量-1,或者说不发生交换的时候,循环变量+1
      • 再次遍历数组,将第一个下标 与对应位置元素 - 1不等的下标返回,若都相等,则返回数组的size + 1
  • 实现代码
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int minPos = 1;
        int size = nums.size(); 
		// 将满足条件的的元素进行交换,将元素放到数组下标等于该元素的位置
        for(int i = 0; i < size; ) {
        	if(nums[i] < size && nums[i] >= 1 && nums[i] != nums[nums[i] - 1]) {
        		int tmp = nums[nums[i] - 1];
        		nums[nums[i] - 1] = nums[i];
        		nums[i] = tmp;
        	}
        	else {
        		++i;
        	}

        }
		
		// 遍历数组,寻找下标与对应位置不等的下标,此下标即为最小整数,否则则为size+1
        for(int i = 0; i < size; ++i) 
        	if(i != nums[i] - 1)
        		return i + 1;
      
        return size + 1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值