美文网首页
LeetCode41. 缺失的第一个正数(排序)JS

LeetCode41. 缺失的第一个正数(排序)JS

作者: 椰果粒 | 来源:发表于2019-05-22 22:14 被阅读0次
/**
 * 41. 缺失的第一个正数
 * @description 给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(arr) {
  // 过滤出所有的负数和0,保留所有的正整数
  arr = arr.filter( item => item>0)
  let len = arr.length
  // 为空则表示没有正整数
  if(len === 0) return 1
  arr.sort((a,b) => a-b)
  if(arr[0] === 1){
    for(let i=0; i<len-1; i++){
      // 如果前后俩值的差值不是1,就说明不是连续的,这时候返回就行
      if(arr[i+1]-arr[i] >1){
        return arr[i]+1
      }
    }
    return arr.pop() + 1
  }else{
    return 1
  }
};
// 改进方式
var firstMissingPositive = function(arr) {
  arr = arr.filter(item => item>0)
  if(arr.length<=0) return 1
  // 选择排序,从左边找最小值
  // 冒泡排序,从右边找最大值
  // 这里用选择排序,先拿到最小值,如果是1,相邻元素差值,如果不是1,返回1
  for(let i=0, len=arr.length, min; i<arr.length; i++){
    min = arr[i];
    for(let j=i+1; j<len; j++){
      if(arr[j] < min){
        let c = min
        min = arr[j]
        arr[j] = c
      }
    }
    arr[i] = min
    if(i>0){
      if(arr[i] -arr[i-1] >1 ){
        return arr[i]-1+1
      }
    }else{
      if(min !== 1){
        return 1
      }
    }
  }
  return arr.length ? arr.pop()+1 : 1
}

相关文章

网友评论

      本文标题:LeetCode41. 缺失的第一个正数(排序)JS

      本文链接:https://www.haomeiwen.com/subject/stwpzqtx.html