乘风破浪:LeetCode真题_041_First Missing Positive
乘风破浪:LeetCode真题_041_First Missing Positive
一、前言
这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制。
二、First Missing Positive
2.1 问题

2.2 分析与解决
读了题目我们或许还不理解题意,其实是说正常的数组应该是[1,2,3,4....]这样的数组,或者打乱次序的,但是对于不是这样的数组,我们需要从中找到从那个数字开始缺少的,这个数字就是最小的数字,比如2,3,4,那么缺少的就是1。比如1,2,4,就是少了3。这样我们就理解了。但是时间复杂度要求O(n),空间使用是常数级别的。
我们仔细思考一下,其实下标和这个是有关系的,正常的,最终都可以变成num[i]=i+1,于是我们可以将数组进行一边扫描,如果已经满足这种性质的不用动,如果num[i]的值小于1或者大于长度的都是不应该存在的,因此置为一个标志,便于以后报错。如果在范围之内的,我们就让它们物归原位。比如num[i]=x,那么这个元素应该在下标为x-1的位置上,因此我们将num[x-1]和num[i]上的元素进行交换。交换的时候如果发现这两个值相等,则将非本位的值置为零,否者直接交换。
class Solution {
// let's rearrange the numbers in the array between 1 and length
// in order (in place), leaving a 0 for numbers not present,
// and ignoring the numbers out of this range.
// then in second pass find the first zero occurence, or if none,
// return length+1
// for example, [3,4,-1,1] will become [1,0,3,4]
public int firstMissingPositive(int[] nums) {
for (int i=0; i<nums.length;) {
int n = nums[i];
if (n<1 || n>nums.length) {
nums[i]=0; // out of range, remove
i++;
} else if (n-1==i) {
i++; // in range and in position, leave as is
} else {
// in range but not in position, swap
int temp = nums[n-1];
nums[n-1]=n;
nums[i]=(temp==n)?0:temp;//这里最妙的就是没有i++,以此确保下一次还从这个地方开始
}
}
for (int i=0; i<nums.length; i++) {
if (nums[i]==0)
return i+1;
}
return nums.length+1;
}
}

三、总结
遇到问题需要和实际的条件相联系,另外需要认真的判断所有的可能。
乘风破浪:LeetCode真题_041_First Missing Positive的更多相关文章
- LeetCode刷题 fIRST MISSING POSITIVE
Given an unsorted integer array,find missing postive integer. For example , Given [1,2,0]return 3, a ...
- 乘风破浪:LeetCode真题_008_String to Integer (atoi)
乘风破浪:LeetCode真题_008_String to Integer (atoi) 一.前言 将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也 ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_039_Combination Sum
乘风破浪:LeetCode真题_039_Combination Sum 一.前言 这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_038_Count and Say
乘风破浪:LeetCode真题_038_Count and Say 一.前言 这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...
- 乘风破浪:LeetCode真题_037_Sudoku Solver
乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决 这道题 ...
- 乘风破浪:LeetCode真题_036_Valid Sudoku
乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...
- 乘风破浪:LeetCode真题_035_Search Insert Position
乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...
- 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array
乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...
随机推荐
- JVM学习记录-Java内存模型(二)
对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...
- JS forEach()与map() 用法(转载)
JavaScript中的数组遍历forEach()与map()方法以及兼容写法 原理: 高级浏览器支持forEach方法语法:forEach和map都支持2个参数:一个是回调函数(item,ind ...
- 使用Java对字符串进行升序排序
Java对字符串的很多API和功能是JavaWeb能广泛发展的基础,下面是一道经典的字符串操作题,需要边查JAVASE的API对每个步骤进行操作. 题目:给一个字符串,"34 12 -8 0 ...
- Java 内部类、静态内部类、匿名内部类
java提高篇(八)----详解内部类 概念 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 为什么要使用内部类?在<Think in java>中有这样一句话:使用内部类最吸引 ...
- 漫画 | Spring AOP
上期,我们看到有小伙伴留言说希望讲讲AOP 然后...... 别激动,来得及 什么是AOP AOP是Spring 框架的一个关键组件,全称为Aspect-OrientedProgramming(面向切 ...
- 理解JVM之垃圾收集器详解
前言 垃圾收集器作为内存回收的具体表现,Java虚拟机规范并未对垃圾收集器的实现做规定,因而不同版本的虚拟机有很大区别,因而我们在这里主要讨论基于Sun HotSpot虚拟机1.6版本Update22 ...
- 面向对象设计模式_享元模式(Flyweight Pattern)解读
场景:程序需要不断创建大量相似的细粒度对象,会造成严重的内存负载.我们可以选择享元模式解决该问题. 享元抽象:Flyweight 描述享元的抽象结构.它包含内蕴和外蕴部分(别被术语迷惑,这是一种比较深 ...
- 使用nginx+tomcat将所有请求都转发到一个页面
1.将页面放到tomcat的root目录下,即ROOT/weihu.html 2.修改nginx配置文件 server{ listen ; # nginx监听的端口 root /opt/apache- ...
- linux_shell_数组
shell数组类似与C语言,数组下标由0开始编号.想要获取数组中的元素要利用下标. 1.首先定义数组 在shell中,用括号来表示数组,数组元素用“空格”符号分割开.列: name=("d& ...
- 封装7z软件实现批量文件或目录压缩
哈哈,作为一个特别懒的运维人来说 兄弟我写了一个批量压缩文件或目录的小工具,用来批量压缩文件目录 弄一下,然后就不用管他了,后天看结果就好了 操作步骤: 1.选择想做压缩处理的根目录 2.选择你要的功 ...