题解 | #数组中未出现的最小正整数#时间O(n)空间O(1)的超简单解法,胎教毕业也能懂

数组中未出现的最小正整数

http://www.nowcoder.com/practice/8cc4f31432724b1f88201f7b721aa391

废话不多说直接上算法流程:

  1. 设置和初始化两个变量i=0pre=arr[0],分别代表指针位置和上一个数
  2. 整个数组其实可以分为两部分:负数部分和整数部分
  3. 结果返回最小正整数,所以一开始遇到负数就先记录pre=arr[i]i++往后移,直到遇到正数或者到了数组最后面也就是i == arr.length
    1. 如果走到了数组最后面,说明整个数组都说负数,那么直接return 1退出程序
    2. 如果没有走到数组最后面,那么说明整数部分要开始了,按照题目要求整数部分是从1开始的,所以设置pre = 0
  4. 继续移动指针,如果i < arr.length && arr[i] == pre+1就继续先记录'pre = arr[i]'再i++
  5. 经过上述步骤i要么移动到了数组最后面,要么移动到了确属数字的哪一位,这时候pre正好记录的就是确属整数的前一个。所以最后直接return pre+1就是最终答案了。
    import java.util.*;  
    public class Solution {
     /**
      * return the min number
      * @param arr int整型一维数组 the array
      * @return int整型
      */
     public int minNumberdisappered (int[] arr) {
         //走到非0的索引处,上一个数
         int i = 0, pre = arr[0];
         while(i < arr.length && arr[i] < 0) {
             pre = arr[i];
             i++;
         }
         // 如果走到了最后,就是整个数组都是负数,直接返回1
         if(i == arr.length) return 1;
         // 没有走到最后,那么从正整数1开始,所以上一个数是0
         else pre = 0;
         // 如果当前数是上一个数加一,就继续往后走
         while(i < arr.length && arr[i] == pre+1) {
             pre++;
             i++;
         }
         // 最后返回上一个数+1即可
         return pre+1;
     }
    }
全部评论

相关推荐

神哥了不得:放平心态,再找找看吧,主要现在计算机也变卷了,然后就比较看学历了,之前高中毕业你技术强,都能找到工作的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务