乘风破浪: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的更多相关文章

  1. LeetCode刷题 fIRST MISSING POSITIVE

    Given an unsorted integer array,find missing postive integer. For example , Given [1,2,0]return 3, a ...

  2. 乘风破浪:LeetCode真题_008_String to Integer (atoi)

    乘风破浪:LeetCode真题_008_String to Integer (atoi) 一.前言 将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也 ...

  3. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  5. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  6. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  7. 乘风破浪:LeetCode真题_036_Valid Sudoku

    乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...

  8. 乘风破浪:LeetCode真题_035_Search Insert Position

    乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...

  9. 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array

    乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...

随机推荐

  1. Linux cp 强制覆盖

     Linux下默认cp命令是有别名(alias cp='cp -i')的,无法强制覆盖,即使你用 -f 参数也无法强制覆盖文件,下面提供两种Linux下cp 覆盖方法. 1) 取消cp的alias,这 ...

  2. 基于Hadoop2.6.5(HA)的Hive1.2.1的MySQL方式配置

    1.Hive配置MySQL Hive只是一个工具,无需配置多台机器,我在CentOS7One机器上配置Hive /usr/local/hive/apache-hive-1.2.1-bin/conf c ...

  3. 【angular5项目积累总结】侧栏菜单 navmenu

    View Code import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/co ...

  4. [转]单据套打WINFORM实现,带预览功能

    本文转自:https://blog.csdn.net/lyflcear/article/details/22795053 昨天公司要打单子而不是以前的手写 为了实现这样的功能上网搜索了一下 http: ...

  5. oracle 恢复错误修改数据 寒冬冒冷汗!!

    今天,由于一时疏忽,造成了对正式数据库修改了用户密码的情况.寒冬冒冷汗!!! 立即上网找修改方法,万幸找到,也修改回来,特此在此留个记忆!! create table t_table_new----这 ...

  6. Weex 学习文档、跳转路径、控制台输出、we转js汇总

    最近在学习阿里的weex框架,网上教程真是不少,但是有用的确实是少的很.其中大多数都是讲如何配置移动端的,很少有讲到weex语法的.要知道,如果真需要用weex编写js页面的话,很有可能是移动端开发者 ...

  7. DRF序列化

    1. 安装 pip install djangoframework 2. app注册 rest_framework INSTALLED_APPS = [ 'django.contrib.admin', ...

  8. Vue中改变对象的注意事项

    数组更改注意事项 Vue无法检测到以下方式变动的数组 当你利用索引直接设置一个项时,例如:vm.items[index] = newValue 当你修改数组的长度时,例如:vm.items.lengt ...

  9. equals 与 == 的区别

    equals 是 用来比较二个对象内容是否相等. == 是用来比较二个对象的内存是否相等. public void testString(){ String s1="123"; S ...

  10. 将caj文件转化为pdf文件进行全文下载脚本(ubuntu下亲测有用)

    最近ubuntu下caj阅读器,突然崩掉了,而偏偏要准备开题,在网上搜索原因未果,准备放弃时候,突然在网上看到一个脚本,说是很好用,可以在指定页面将caj文件转化为pdf文件,亲测有用,这里直接给出脚 ...