《leetCode》:First Missing Positive
2015-11-09 21:26
239 查看
题目
Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] return 3, and [3,4,-1,1] return 2. Your algorithm should run in O(n) time and uses constant space.
题意:在没有排序的数组中找到第一个丢失的正整数(从1开始的)。要求时间复杂度为O(n)以及只允许用常数个空间
思路
思路:由于题目中明确的强调了时间复杂度为O(n),因此我们不可能采用将数组进行排序, 然后找到第一个相邻的两个数不相等中的第一个数加1就是我们要找的数,因为这样即使采用快排的时间复杂度也为O(nlogn) 因此,我们必须采用其他的方法。 我们都知道。一个从1开始的连续的整数的数组Arr[6]=[1,2,3,4,5,6];中有Arr[i]=i+1(数组下标从零开始的)这样的特点。 基于这样的特点,有了如下思路:我们遍历一次数组,将正数A[i]放在数组的第A[i]-1个位置,即swap(A[i],A[A[i]-1]); 使得完成遍历后A[i]与i+1相等,这样我们最终只需要寻找第一个不满足这样关系的前一个数加1就是我们要求的数。
实现代码如下:
void swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp; } int firstMissingPositive(int* nums, int numsSize) { if(nums==NULL||numsSize<1){ return 1; } for(int i=0;i<numsSize;){ if(nums[i]<0||nums[i]>numsSize||nums[i]==i+1||nums[i] == nums[nums[i] - 1]){ i++; } else{ //有一点需要注意的是:交换后并不执行i++操作,而是继续将交换到当前位置的元素 交换到应该属于到的位置 swap(&nums[i],&nums[nums[i]-1]);//将nums[i]放在数组的第i个位置。 } } int i=0; for(;i<numsSize;i++){ if(nums[i]!=i+1){ break; } } return nums[i-1]+1; }
遇到的问题
1、刚开始只知道遍历一次数组,将数组中的元素A[i]放到数组的第A[i]-1个位置。交换之后,就进行了i++操作,并没有对当前i值时新交换来的元素继续进行同样的操作。因此报错。刚开始的代码和报错截图如下:
for(int i=0;i<numsSize;i++){ if(nums[i]<0||nums[i]>numsSize||nums[i]==i+1||nums[i] == nums[nums[i] - 1]){ continue; } else{ //有一点需要注意的是:交换后并不执行i++操作,而是继续将交换到当前位置的元素 交换到应该属于到的位置 swap(&nums[i],&nums[nums[i]-1]);//将nums[i]放在数组的第i个位置。 } }
最后的AC结果如下:
相关文章推荐
- Java普通方法与static方法的多态
- BLE4.0配对绑定过程的底层剖析
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- hdoj 1406 完数
- 模拟操作系统进程调度算法
- oracle存储过程中使用其他用户的表或视图
- myeclipse maven web项目创建
- WordPress下载管理插件
- Eclipse使用技巧收集
- 联想一键还原系统安装流程记录
- python编程环境搭建
- UCI机器学习数据库
- 有源滤波电路基础
- HttpClient 讲解 (1) 基础
- 重装Win7后恢复和找回Ubuntu启动项
- 【数据结构与算法分析】2.1 斐波拉切数列算法实现
- 【Unity Shaders and Effects Cookbook】Diffuse Shading
- [置顶] OpenLayers 3 之 加载天地图
- 父子进程终止顺序与僵死进程
- Android学习之简单地使用碎片