• 【趣味算法题】找到缺失的最小正整数


    【题目描述】

    有一个随机序列的数组,找到其中缺失的最小正整数

    举例如下,在[1,  2,  0] 中,该最小正整数应为3

    在[3,  4,  -1,  1]中,该最小正整数应该为2

    【解题思路】

    如果允许开辟任意大小的空间,易得用桶的思想可以解决这题

    简单的说,开辟一个数组,从1扫过来如果不存在那么break输出即可

    如果对空间的要求是O(1) ,利用桶排序接下来有一个非常漂亮的解决方法:

    我们可以把每个数字放在其该放的地方。什么意思呢?

    比如 A[0] = 1, A[1] = 2, A[2] = 3, 诸如此类

    然后放好之后从1扫过来如果不存在那么break输出即可

    关键就是在于,如何将每个数字放在其该放的地方呢

    方法如下:

    如果 A[i] 是合法的数 (合法的意思是 A[i] > 0 && A[i] < n)

    那么A[i] 应该放的位置为 A[A[i] - 1] 才对。

    如果当然的 A[i] 不在 A[A[i] - 1] 的话,那么swap (A[i], A[A[i] - 1]) 即可

    这到题目就是利用这个思路解决,如果碰到重复出现的数字也是可以解决 :)

    【算法效率分析】

    O(1) space, and O(n) time

    My Source Code:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            bucket_sort (nums);
    
            for (int i = 0; i < nums.size (); ++i) {
                if (nums[i] != i + 1) {
                    return i + 1;
                }
            }
    
            return nums.size () + 1;
        }
    
        void bucket_sort (vector <int> & nums) {
            for (int i = 0; i < nums.size (); ++i) {
                while (nums[i] != i + 1) {
                    if (nums[i] < 0 || nums[i] > nums.size () || 
                        nums[i] == nums[nums[i] - 1]) {
                            break;
                        }
                    cout << "i = " << i << "	" << nums[i] << "	" << nums[nums[i] - 1] << endl;
                    swap (nums[i], nums[nums[i] - 1]);
                    cout << "	";
                    for (int j = 0; j < nums.size (); ++j) {
                        cout << nums[j] << " ";
                    }
                    cout << endl << endl;
                }
            }
        }
    };
    
    int main () {
    
        Solution sl;
        vector <int> vc;
        vc.push_back (3);
        vc.push_back (-4);
        vc.push_back (2);
        vc.push_back (1);
        vc.push_back (5);
    
        cout << sl.firstMissingPositive (vc);
    
        return 0;
    }

    推荐阅读文章:

    三种线性排序算法 计数排序、桶排序与基数排序

    https://www.byvoid.com/blog/sort-radix/

  • 相关阅读:
    Java注释Override、Deprecated、SuppressWarnings详解
    android: 实现跨程序数据共享
    android: 创建自己的内容提供器
    android: 通过内容提供器读取系统联系人
    android: 内容提供器简介
    android: UriMatcher的用法
    java中static{}语句块详解
    android: SQLite 数据库的最佳实践
    android: SQLite使用 SQL 操作数据库
    android: SQLite查询数据
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4558557.html
Copyright © 2020-2023  润新知