zoukankan      html  css  js  c++  java
  • 力扣算法题—041缺失的第一个正数

     1 #include "000库函数.h"
     2 
     3 
     4 //先排序,然后找值
     5 //自己的解法 12ms
     6 //class Solution {
     7 //public:
     8 //    int firstMissingPositive(vector<int>& nums) {
     9 //        sort(nums.rbegin(),nums.rend());//对数组进行逆序排序
    10 //        for (int i = nums.size() - 1; i >= 0; --i)
    11 //            if (nums[i] < 1)nums.pop_back();//将小于1的数删除
    12 //        if (nums.size() == 0 || nums[nums.size()-1] > 1)return 1;//若数组为空或者最小值大于1,则返回1
    13 //        if (nums.size() == 1)return nums[0] == 1 ? 2 : 1;//当且只有1个元素时,若是1,就返回2否则返回1
    14 //        for (int i = nums.size() - 2; i >= 0; --i) {
    15 //            if (nums[i] - nums[i + 1] > 1)//找到间隔大于1的相邻两数,
    16 //                return nums[i + 1] + 1;//返回较小数+1
    17 //        }        
    18 //        return nums[0] + 1;//返回最大数+1
    19 //    }
    20 //};
    21 
    22 
    23 //第二种解法更好用
    24 //先排序,将小于1的数删除,然后存入剩下的数,若数组下角标不是该值,则返回该数
    25 //我以为会很快,但都是12ms,但点子很好,你觉得呢?
    26 class Solution {
    27 public:
    28     int firstMissingPositive(vector<int>& nums) {
    29         sort(nums.begin(), nums.end());//排序
    30         vector<int>v;
    31         v.push_back(0);//将0与下标为0的位置占用
    32         for (int i = 0, j = 0; i < nums.size(); ++i) {
    33             if (nums[i] < 1 || nums[i] == v.back())continue;//排除小于1的数和去除重复数字
    34             v.push_back(nums[i]);
    35             ++j;
    36             if (j != nums[i])return j;//小角标未与该处的数字对应
    37         }    
    38         return v.back() + 1;//原数组是连续的,返回最大数+1;
    39     }
    40 };
    41 
    42 
    43 //博客的解答
    44 //我怎么感觉复杂一丢丢
    45 //除了排序是自己做的,原理都一样,找下角标
    46 //同样12ms
    47 class Solution {
    48 public:
    49     int firstMissingPositive(vector<int>& nums) {
    50         int n = nums.size();
    51         for (int i = 0; i < n; ++i) {
    52             while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
    53                 swap(nums[i], nums[nums[i] - 1]);
    54             }
    55         }
    56         for (int i = 0; i < n; ++i) {
    57             if (nums[i] != i + 1) return i + 1;
    58         }
    59         return n + 1;
    60     }
    61 };
    62 
    63 void T041() {
    64     Solution s;
    65     vector<int>n;
    66     n = {2,1 };
    67     cout << s.firstMissingPositive(n) << endl;
    68     n = { 3,4,-1,1 };
    69     cout << s.firstMissingPositive(n) << endl;
    70     n = { 7,8,9,11,12 };
    71     cout << s.firstMissingPositive(n) << endl;
    72     n = {100,-9};
    73     cout << s.firstMissingPositive(n) << endl;
    74     n = { 0,2,2,1,1 };
    75     cout << s.firstMissingPositive(n) << endl;
    76 }
  • 相关阅读:
    依赖注入及AOP简述(二)——工厂和ServiceLocator .
    依赖注入及AOP简述(一)——“依赖”的概念 .
    Java程序员应该知道的10个面向对象理论
    IOC原理分析
    android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
    Android长方形图片生成正圆形,以及矩形图片生成圆角
    MATLAB新手教程
    BitNami一键安装Redmine
    VB6.0数据库开发五个实例——罗列的总结
    java绘图板
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10575273.html
Copyright © 2011-2022 走看看