leetcode刷题笔记四十一 缺失的第一个正数

leetcode刷题笔记四十一 缺失的第一个正数

源地址:41. 缺失的第一个正数

问题描述:

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3
示例 2:

输入: [3,4,-1,1]
输出: 2
示例 3:

输入: [7,8,9,11,12]
输出: 1

提示:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。

代码补充:

//本题难点主要是在O(n)时间复杂度上,O(1)的空间幅度上完成
//核心是将数组的索引与数建立关系,是nums(i) == i+1 [nums(nums(i)-1) != nums(i)]
//通过一次循环,将数组进行排序,并且位置满足条件要求
//对于不满足nums(i) == i+1的i,直接返回i+1
//遍历完未发现,返回length+1
object Solution {
    def firstMissingPositive(nums:Array[Int]): Int = {
        for(i <- 0 until nums.length){
            while(1 <= nums(i) && nums(i) <= nums.length && nums(nums(i)-1) != nums(i)){
                val temp = nums(i)
                nums(i) = nums(nums(i)-1)  
                nums(temp-1) = temp

            }
        }
        //println(nums.mkString(" "))
        for(i <- 0 to nums.length-1){
            //println("------------------")
            //println(i)
            //println(nums(i))
            if(nums(i) != i+1) return i+1
        }
        return nums.length+1
    }
}
posted @ 2020-05-25 23:18  ganshuoos  阅读(104)  评论(0编辑  收藏  举报