LeetCode | 448. Find All Numbers Disappeared in an Array【经典题】
2017-03-20 20:41
127 查看
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:
Input:
[4,3,2,7,8,2,3,1]
Output:
[5,6]
我自己做的相当笨的方法,遍历套遍历,非常笨。代码如下:
看到discuss里面的奇妙思路又跪了,简单解释下:
思路是这样的,数组的每个位置经历一次正负号的标记,标记后,如果该位置的值仍是正数,则说明其未被标记过,即该位置下标+1的对应数在数组中不曾出现。
标记的方法是遍历原数组中的每个值,每个值-1后,代表的是1到n排序后的下标,把对应下标上的数组值置为负数,证明其出现过。否则没有。
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:
Input:
[4,3,2,7,8,2,3,1]
Output:
[5,6]
我自己做的相当笨的方法,遍历套遍历,非常笨。代码如下:
public class Solution { public List<Integer> findDisappearedNumbers(int[] nums) { Arrays.sort(nums); List<Integer> list = new ArrayList<Integer>(); int flag = 0; for(int i = 1; i <= nums.length; i++) { while(true) { if(i == nums[flag]) { if(flag < nums.length - 1) flag++; break; } if(i < nums[flag] || i > nums[nums.length - 1]) { list.add(i); break; } flag++; } } return list; } }
看到discuss里面的奇妙思路又跪了,简单解释下:
思路是这样的,数组的每个位置经历一次正负号的标记,标记后,如果该位置的值仍是正数,则说明其未被标记过,即该位置下标+1的对应数在数组中不曾出现。
标记的方法是遍历原数组中的每个值,每个值-1后,代表的是1到n排序后的下标,把对应下标上的数组值置为负数,证明其出现过。否则没有。
public List<Integer> findDisappearedNumbers(int[] nums) { List<Integer> ret = new ArrayList<Integer>(); for(int i = 0; i < nums.length; i++) { int val = Math.abs(nums[i]) - 1; if(nums[val] > 0) { nums[val] = -nums[val]; } } for(int i = 0; i < nums.length; i++) { if(nums[i] > 0) { ret.add(i+1); } } return ret; }
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【075-Sort Colors (颜色排序)】
- 【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】
- leetcode+DP很经典的
- 【leetcode73】经典算法-Guess Number Higher or Lower
- 【LeetCode-面试算法经典-Java实现】【108-Convert Sorted Array to Binary Search Tree(排序数组转变为平衡二叉树)】
- 【LeetCode-面试算法经典-Java实现】【112-Path Sum(路径和)】
- leetcode -- Sudoku Solver -- 经典重点
- 【LeetCode-面试算法经典-Java实现】【169-Majority Element(主元素)】
- 【LeetCode-面试算法经典-Java实现】【190-Reverse Bits(反转二制)】
- Leetcode 276. Paint Fence (经典DP)
- 【LeetCode-面试算法经典-Java实现】【198-House Robber(抢劫犯)】
- 【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】
- 【LeetCode-面试算法经典-Java实现】【215-Kth Largest Element in an Array(数组中第K大的数)】
- 【LeetCode-面试算法经典-Java实现】【225-Implement Stack using Queues(用队列实现栈操作)】
- 【LeetCode-面试算法经典-Java实现】【030-Substring with Concatenation of All Words(串联所有单词的子串)】
- 【LeetCode-面试算法经典-Java实现】【066-Plus One(加一)】
- 【LeetCode-面试算法经典-Java实现】【077-Combinations(组合数)】
- 【LeetCode-面试算法经典-Java实现】【073-Climbing Stairs(爬楼梯)】
- 【leetcode】经典算法题-Counting Bits
- 【leetcode73】经典算法-Guess Number Higher or Lower