Missing Number
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
解法:从1到n求和,然后依次减去数组中各元素,所得即为缺失的数。
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解法:两个相同的数异或为0, 某个数与0异或结果即为该数。
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
解法一:
public class Solution { public int majorityElement(int[] num) { if(num.length==1){ return num[0]; } Arrays.sort(num); int prev=num[0]; int count=1; for(int i=1; i<num.length; i++){ if(num[i] == prev){ count++; if(count > num.length/2) return num[i]; }else{ count=1; prev = num[i]; } } return 0; } }
解法二:
public int majorityElement(int[] num) { if (num.length == 1) { return num[0]; } Arrays.sort(num); return num[num.length / 2]; }
解法三:
public int majorityElement(int[] nums) { int result = 0, count = 0; for(int i = 0; i<nums.length; i++ ) { if(count == 0){ result = nums[i]; count = 1; }else if(result == nums[i]){ count++; }else{ count--; } } return result; }
Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
解法:设置两个选举数,经过一次遍历选出出现频率最大的两个数,再进行一次遍历判断它们的出现次数是否大于⌊ n/3 ⌋
public class Solution { public List<Integer> majorityElement(int[] nums) { List<Integer> result = new ArrayList<Integer>(); int r1 = 0; int r2 = 0; int count1 = 0; int count2 = 0; for (int i = 0; i < nums.length; i++) { if (r1 == nums[i]) { count1++; } else if (r2 == nums[i]) { count2++; } else if (count1 == 0) { r1 = nums[i]; count1 = 1; } else if (count2 == 0) { r2 = nums[i]; count2 = 1; } else { count1--; count2--; } } count1 = 0; count2 = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] == r1) { count1++; } else if (nums[i] == r2) { count2++; } } if (count1 > nums.length / 3) { result.add(r1); } if (count2 > nums.length / 3) { result.add(r2); } return result; } }
注意:选举过程中判断某个元素是否跟两个当前选举数相等和两个count数是否为零的先后顺序不能颠倒。
譬如改为:
for (int i = 0; i < nums.length; i++) { if (count1 == 0) { r1 = nums[i]; count1 = 1; } else if (r1 == nums[i]) { count1++; } else if (count2 == 0) { r2 = nums[i]; count2 = 1; } else if (r2 == nums[i]) { count2++; } else { count1--; count2--; } }
此段在leetcode上会通过,但是事实上当数组输入为[1,2,2,3,2,2,4,5,6,7]时,在eclipse中输出结果为[]。而正确结果应该为[2].