zoukankan      html  css  js  c++  java
  • leetcode41. 缺失的第一个正数

    思路:

    由于对时间复杂度要求O(n),所以不能采用排序再二分查找的方法。

    由于空间复杂度要求常数级,所以放弃哈希表法。

    所以我们采用一种数组中较为常用的方法——原地哈希。将原数组作为哈希表。

    代码

     1 class Solution {
     2 public:
     3     int firstMissingPositive(vector<int>& nums) {
     4         for (int i = 0; i < nums.size(); ++i) {
     5             while (nums[i] >= 1 && nums[i] <= nums.size() && nums[i] != nums[nums[i]-1]) //注意
     6                 swap(nums[i], nums[nums[i]-1]);
     7         }
     8         
     9         for (int i = 0; i < nums.size(); ++i) {
    10             if (nums[i] != i + 1) return i+1;
    11         }
    12         return nums.size() + 1;
    13     }
    14 };

    注意:代码第5行最后的判断条件是 nums[i] != nums[nums[i]-1] 而不是nums[i] != i+1,如果写成后者会出现死循环。比如下标为1和5的位置值都是6,5位置上的6本就处在正确位置了,这时候遍历到3时如果判断不等于4就交换就会两个6一直交换造成死循环,所以应该判断的是是否和要交换位置的元素值相等,如果相等了就不用再交换了。

  • 相关阅读:
    super与this的区别?
    springboot(4)-thymeleaf
    springboot(3)-自定义josn
    springboot(2)-Http协议接口开发
    springboot(1)-HelloWorld
    SpringSecurityOauth2.0
    Docker 应用部署
    RabbitMQ02
    RabbitMQ01
    011通用寄存器
  • 原文地址:https://www.cnblogs.com/joker1937/p/14670414.html
Copyright © 2011-2022 走看看