直接暴力解法:找到无序数组中未出现的最小正整数,要求空间复杂度为1

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

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

题目描述
给定一个无序数组arr,找到数组中未出现的最小正整数
例如arr = [-1, 2, 3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)

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

空复为1,就不能使用map集合之类的快捷方法了,直接暴力解法,容易理解:
1、排序
2、从正整数部分开始从1比较,如果是在开头部分,那么直接返回1;
如果实在中间部分,那么比较值递增,出现的第一个不等的数字就是;
如果比较到最后都符合,那么返回下一个数即可;
前两个可以合并,就是如下的程序:

牛客的测试用例 运行时间: 933ms 占用内存: 247960KB
但是用例有个小缺陷,就是如果前面一直都是符合要求的数字,没有返回最后的下一个值是测试不出来的,比如:[1 2 3 4 5] 前面都是符合的,应该返回6,但是测试用例好像没有覆盖这种情况,本程序还是考虑到的。

import java.util.*;

public class Solution {
    /**
     * return the min number
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int minNumberdisappered (int[] arr) {
        // 找到最小的数字,然后返回比它还小一个的数字
        Arrays.sort(arr);        //先排序
        int result = 1;        //输出结果
        int index = 1;        //用于对比的最小正整数
        for(int j=0; j<arr[arr.length-1]; j++){        //要比较到最大值
            if(arr[j] <= 0)
                continue;        //将非正整数跳过
            if(j==arr.length-1 && arr[j]==index)        //比较到最后前面都相同,那么返回下一个比较值
                return index+1;
            if(arr[j] != index){        //从1开始比较,涵盖返回值在开头和中间的情况
                result = index;
            }else{
                index++;        //注意要将比较值加1
            }
        }
        return result;
    }
}
全部评论
你这不对吧,sort的时间复杂度就是O(nlogn)了
1 回复 分享
发布于 2020-09-23 16:52
这个一排序,不就是O(n log(n))了吗?
点赞 回复 分享
发布于 2020-09-27 21:48
O(∩_∩)O哈哈~,本小白娱乐为主,大家看看就好,仅供吐槽参考^_^,后面会根据水平修改♪(^∇^*)
点赞 回复 分享
发布于 2020-09-25 21:36
啊这…
点赞 回复 分享
发布于 2020-09-25 11:53
这个题解给的真的是好逗
点赞 回复 分享
发布于 2020-09-23 21:43
不是有O(n)的时间要求吗
点赞 回复 分享
发布于 2020-09-22 11:19

相关推荐

05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
Rena1ssanc...:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
ohs的小木屋:比不少实习待遇高了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务