zoukankan      html  css  js  c++  java
  • 未出现的最小正整数

    引入

      给定一个无序整型数组 arr ,找到数组中未出现的最小正整数。

    分析

      令无序整形数组 arr 的大小为 n,可以推出未出现的最小正整数

      最优情况为是数组 arr 包含 1 ~ n 所有整数并且 arr[i-1] = i。

      ① 如果 arr[l] == 1 + l,所以 arr 已经包含的正整数范围为[1,l+1],还未确定的最优范围为 (l+1,r]。

      ②

        1. 如果 arr[l] <= l,因为 arr 已经包含的正整数范围为[1,l],所以当arr[l] <= l 时说明重复或者为负数,“浪费”了一个位置,

                     此时将 arr[r-1] = arr[l],同时将还未确定的最优范围改成(l,r-1]。

        2. 如果 arr[l] > r,因为超出了最优范围(l,r],所以“浪费”了一个位置,此时将 arr[r-1] = arr[l],

                     同时将还未确定的最优范围改成(l,r-1]。

        3. 如果 arr[arr[l] - 1] == arr[l],说明 arr[l] ,而且应该把这个数放在 arr[l] - 1的位置上,但此时arr[arr[l] - 1] == arr[l],

                     说明 arr[l] 重复,”浪费“了一个位置,所以同 1,2步一样,将 arr[r-1] = arr[l],同时将还未确定的最优范围改成(l,r-1]。

      ③ 此时说明 arr[l] ,并且此时并未发现重复,应该将 arr[l] 放到 arr[l] - 1 的位置上,所以交换。

    实现

    int findMissMin(int arr[],int n) 
    {
            int l = 0;
            int r = n;
            while (l < r) 
            {
                if (arr[l] == l + 1) 
                    l++;
                else if (arr[l] <= l || arr[l] > r || arr[arr[l] - 1] == arr[l]) 
                    arr[l] = arr[--r];
                 else 
                    swap(arr, l, arr[l] - 1);
            }
            return l + 1;
    }
  • 相关阅读:
    watch 监听路由的改变
    三元运算符
    element-ui动态更改el-table某个单元格字体颜色
    vue 跨域问题导致前端无法携带cookie
    Vue 用checkbox实现两两组合多选且禁用第三个。
    表格数据宽度自适应方案
    echarts细节问题
    es6 解构赋值
    学习笔记-Python基础15-持久化-文件、pickle、shelve
    学习笔记-Python基础14-PyCharm调试
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/13122244.html
Copyright © 2011-2022 走看看