https://leetcode.com/problems/third-maximum-number/
def thirdMax(self, nums): """ :type nums: List[int] :rtype: int """ a = b = c = None for n in nums: if n > a: a, b, c = n, a, b elif a > n > b: b, c = n, b elif b > n > c: c = n return c if c is not None else a
X. TreeSet
https://discuss.leetcode.com/topic/63903/short-easy-c-using-set/8
http://www.cnblogs.com/grandyang/p/5983113.html
下面这种方法利用了set的自动排序和自动去重复项的特性,很好的解决了问题,对于遍历到的数字,加入set中,重复项就自动去掉了,如果此时set大小大于3个了,那么我们把set的第一个元素去掉,也就是将第四大的数字去掉,那么就可以看出set始终维护的是最大的三个不同的数字,最后遍历结束后,我们看set的大小是否为3,是的话就返回首元素,不是的话就返回尾元素
X. Use PriorityQueue with HashSet to check duplicate
- Faster than TreeSet as there is no need to keep the elements in the PQ sorted as TreeSet
https://discuss.leetcode.com/topic/63086/java-priorityqueue-o-n-o-1
http://algorithms.tutorialhorizon.com/find-the-element-which-appears-maximum-number-of-times-in-the-array/
public void maxRepeatingElementUsingSorting(int [] arrA){
if(arrA.length<1){
System.out.println("Inavlid Array");
return;
}
Arrays.sort(arrA);
int count=1;
int maxCount=1;
int currentElement = arrA[0];
int maxCountElement =arrA[0];
for (int i = 1; i <arrA.length ; i++) {
if(currentElement==arrA[i]){
count++;
}else{
if(count>maxCount){
maxCount = count;
maxCountElement = currentElement;
}
currentElement = arrA[i];
count = 1;
}
}
System.out.println("Element repeating maximum no of times: " + maxCountElement + ", maximum count: " + maxCount);
}
int size = arrA.length;
int maxCount=0;
int maxIndex=0;
for (int i = 0; i <size ; i++) {
//get the index to be updated
int index = arrA[i]% size;
arrA[index] = arrA[index] + size;
}
for (int i = 0; i <size ; i++) {
if(arrA[i]/size>maxCount){
maxCount=arrA[i]/size;
maxIndex=i;
}
}
System.out.println("Element repeating maximum no of times: " + arrA[maxIndex]%size + ", maximum count: " + maxCount);
}
http://algorithms.tutorialhorizon.com/find-duplicates-in-an-given-array-in-on-time-and-o1-extra-space/
for (int i = 0; i < arrA.length; i++) {
//check if element is negative, if yes the we have found the duplicate
if (arrA[Math.abs(arrA[i])] < 0) {
System.out.println("Array has duplicates : " + Math.abs(arrA[i]));
} else {
arrA[Math.abs(arrA[i])] = arrA[Math.abs(arrA[i])] * -1;
}
}
}
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1] Output: 1 Explanation: The third maximum is 1.
Example 2:
Input: [1, 2] Output: 2 Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1] Output: 1 Explanation: Note that the third maximum here means the third maximum distinct number. Both numbers with value 2 are both considered as second maximum.
https://discuss.leetcode.com/topic/63715/java-neat-and-easy-understand-solution-o-n-time-o-1-space
https://discuss.leetcode.com/topic/62236/java-solution-in-0ms-run-time-o-n-and-space-o-1
public int thirdMax(int[] nums) {
Integer max1 = null;
Integer max2 = null;
Integer max3 = null;
for (Integer n : nums) {
if (n.equals(max1) || n.equals(max2) || n.equals(max3)) continue;
if (max1 == null || n > max1) {
max3 = max2;
max2 = max1;
max1 = n;
} else if (max2 == null || n > max2) {
max3 = max2;
max2 = n;
} else if (max3 == null || n > max3) {
max3 = n;
}
}
return max3 == null ? max1 : max3;
}
http://www.jianshu.com/p/e9dfd2494f41 public int thirdMax (int[] nums) {
long first = Long.MIN_VALUE;
long second = Long.MIN_VALUE;
long third = Long.MIN_VALUE;
for (int i:nums){
if (i>first){
third = second;
second = first;
first = i;
}else if (i == first) //必要
continue;
else if (i > second){
third = second;
second = i;
}else if (i == second) //必要
continue;
else if (i > third){
third = i;
}
}
return third == Long.MIN_VALUE ? (int)first : (int)third;
//method 要求返回类型为int,强制转化一下,narrowing conversion
}
https://discuss.leetcode.com/topic/63671/o-n-time-o-1-space-java-short-solution public int thirdMax(int[] nums) {
long first=Long.MIN_VALUE;
long second=Long.MIN_VALUE;
long third=Long.MIN_VALUE;
for(int i:nums){
if(i>first){
third=second;
second=first;
first=i;
}else if(i==first)
continue;
else if(i>second){
third=second;
second=i;
}else if(i==second)
continue;
else if(i>third){
third=i;
}
}
return third==Long.MIN_VALUE?(int)first:(int)third;
}
https://discuss.leetcode.com/topic/62236/java-solution-in-0ms-run-time-o-n-and-space-o-1
public int thirdMax(int[] nums) {
int max, mid, small, count;
max = mid = small = Integer.MIN_VALUE;
count = 0; //Count how many top elements have been found.
for( int x: nums) {
//Skip loop if max or mid elements are duplicate. The purpose is for avoiding right shift.
if( x == max || x == mid ) {
continue;
}
if (x > max) {
//right shift
small = mid;
mid = max;
max = x;
count++;
} else if( x > mid) {
//right shift
small = mid;
mid = x;
count++;
} else if ( x >= small) { //if small duplicated, that's find, there's no shift and need to increase count.
small = x;
count++;
}
}
//"count" is used for checking whether found top 3 maximum elements.
if( count >= 3) {
return small;
} else {
return max;
}
}
http://bookshadow.com/weblog/2016/10/09/leetcode-third-maximum-number/
利用变量a, b, c分别记录数组第1,2,3大的数字
遍历一次数组即可,时间复杂度O(n)
def thirdMax(self, nums): """ :type nums: List[int] :rtype: int """ a = b = c = None for n in nums: if n > a: a, b, c = n, a, b elif a > n > b: b, c = n, b elif b > n > c: c = n return c if c is not None else a
X. TreeSet
https://discuss.leetcode.com/topic/63903/short-easy-c-using-set/8
public int thirdMax(int[] nums) {
TreeSet<Integer> set = new TreeSet<>();
for(int num : nums) {
set.add(num);
if(set.size() > 3) {
set.remove(set.first());
}
}
return set.size() < 3 ? set.last() : set.first();
}
https://discuss.leetcode.com/topic/65119/java-solution-using-treeset public final int N = 3;
public int thirdMax(int[] nums) {
if (nums.length == 0) return 0;
TreeSet<Integer> set = new TreeSet<Integer>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) continue;
if (set.size() < N || nums[i] > set.first()) {
if (set.size() == N) set.remove(set.first());
set.add(nums[i]);
}
}
return set.size() == N ? set.first() : set.last();
}
http://www.cnblogs.com/grandyang/p/5983113.html
下面这种方法利用了set的自动排序和自动去重复项的特性,很好的解决了问题,对于遍历到的数字,加入set中,重复项就自动去掉了,如果此时set大小大于3个了,那么我们把set的第一个元素去掉,也就是将第四大的数字去掉,那么就可以看出set始终维护的是最大的三个不同的数字,最后遍历结束后,我们看set的大小是否为3,是的话就返回首元素,不是的话就返回尾元素
int thirdMax(vector<int>& nums) { set<int> s; for (int num : nums) { s.insert(num); if (s.size() > 3) { s.erase(s.begin()); } } return s.size() == 3 ? *s.begin() : *s.rbegin(); }
X. Use PriorityQueue with HashSet to check duplicate
- Faster than TreeSet as there is no need to keep the elements in the PQ sorted as TreeSet
https://discuss.leetcode.com/topic/63086/java-priorityqueue-o-n-o-1
public int thirdMax(int[] nums) {
PriorityQueue<Integer> pq = new PriorityQueue<>();// min heap
Set<Integer> set = new HashSet<>();
for (int i : nums) {
if (!set.contains(i)) {
pq.offer(i);
set.add(i);
if (pq.size() > 3) {
set.remove(pq.poll());
}
}
}
if (pq.size() < 3) {// if there is less than 3, we return the the last one
while (pq.size() > 1) {
pq.poll();
}
}
return pq.peek(); // otherwise kth is the first one in the min heap
}
Related:http://algorithms.tutorialhorizon.com/find-the-element-which-appears-maximum-number-of-times-in-the-array/
Objective: Given an array of integers, write a algorithm to find the element which appears maximum number of times in the array.
Better Solution : Use Hashmap. Store the count of each element of array in a hash table and later check in Hash map which element has the maximum count
public void maxRepeatingElementUsingSorting(int [] arrA){
if(arrA.length<1){
System.out.println("Inavlid Array");
return;
}
Arrays.sort(arrA);
int count=1;
int maxCount=1;
int currentElement = arrA[0];
int maxCountElement =arrA[0];
for (int i = 1; i <arrA.length ; i++) {
if(currentElement==arrA[i]){
count++;
}else{
if(count>maxCount){
maxCount = count;
maxCountElement = currentElement;
}
currentElement = arrA[i];
count = 1;
}
}
System.out.println("Element repeating maximum no of times: " + maxCountElement + ", maximum count: " + maxCount);
}
Better Solution (Conditional) : O(n) time and O(1) extra space.
- This solution works only if array has positive integers and all the elements in the array are in range from 0 to n-1 where n is the size of the array.
- Navigate the array.
- Update the array as for ith index :- arrA[arrA[i]% n] = arrA[arrA[i]% n] + n;
- Now navigate the updated array and check which index has the maximum value, that index number is the element which has the maximum occurrence in the array.
int size = arrA.length;
int maxCount=0;
int maxIndex=0;
for (int i = 0; i <size ; i++) {
//get the index to be updated
int index = arrA[i]% size;
arrA[index] = arrA[index] + size;
}
for (int i = 0; i <size ; i++) {
if(arrA[i]/size>maxCount){
maxCount=arrA[i]/size;
maxIndex=i;
}
}
System.out.println("Element repeating maximum no of times: " + arrA[maxIndex]%size + ", maximum count: " + maxCount);
}
http://algorithms.tutorialhorizon.com/find-duplicates-in-an-given-array-in-on-time-and-o1-extra-space/
Given an array of integers, find out duplicates in it.
Better Solution : Use Hash map. Store the count of each element of array in a hash table and later check in Hash table if any element has count more than 1
Better Solution (Conditional) : O(n) time and O(1) extra space.
- This solution works only if array has positive integers and all the elements in the array are in range from 0 to n-1 where n is the size of the array.
- Navigate the array.
- Update the array as for ith index :- arrA[arrA[i]] = arrA[arrA[i]]*-1 (if it already not negative).
- If is already negative, we have duplicates, return false.
Note:
- The code given below does not handle the case when 0 is present in the array.
- To handle 0 in array, while navigating the array, when 0 is encountered, replace it with INT_MIN and if INT_MIN is encountered while traversing, this means 0 is repeated in the array.
for (int i = 0; i < arrA.length; i++) {
//check if element is negative, if yes the we have found the duplicate
if (arrA[Math.abs(arrA[i])] < 0) {
System.out.println("Array has duplicates : " + Math.abs(arrA[i]));
} else {
arrA[Math.abs(arrA[i])] = arrA[Math.abs(arrA[i])] * -1;
}
}
}