题目

类型:HashTable
难度:困难
image.png

解题思路

对数组进行遍历,对于遍历到的数 x,如果它在 [1, N]的范围内,那么就将数组中的第 x-1个位置(注意:数组下标从 0 开始)打上「标记」。
在遍历结束之后,如果所有的位置都被打上了标记,那么答案是 N+1,否则答案是最小的没有打上标记的位置加 1。

image.png

代码

  1. class Solution {
  2. public int firstMissingPositive(int[] nums) {
  3. int n = nums.length;
  4. for (int i = 0; i < n; ++i) {
  5. if (nums[i] <= 0) {
  6. nums[i] = n + 1;
  7. }
  8. }
  9. for (int i = 0; i < n; ++i) {
  10. int num = Math.abs(nums[i]);
  11. if (num <= n) {
  12. nums[num - 1] = -Math.abs(nums[num - 1]);
  13. }
  14. }
  15. for (int i = 0; i < n; ++i) {
  16. if (nums[i] > 0) {
  17. return i + 1;
  18. }
  19. }
  20. return n + 1;
  21. }
  22. }