Day13
本题需要构造单调队列来完成。
class Solution {
public int [ ] maxSlidingWindow ( int [ ] nums, int k) {
ArrayDeque < Integer > deque = new ArrayDeque < > ( ) ;
int n = nums. length;
int [ ] ans = new int [ n - k + 1 ] ;
int idx = 0 ;
for ( int i = 0 ; i < n; i++ ) {
while ( ! deque. isEmpty ( ) && deque. peek ( ) < i - k + 1 ) {
deque. poll ( ) ;
}
while ( ! deque. isEmpty ( ) && nums[ deque. getLast ( ) ] < nums[ i] ) {
deque. removeLast ( ) ;
}
deque. offer ( i) ;
if ( i >= k - 1 ) {
ans[ idx++ ] = nums[ deque. peek ( ) ] ;
}
}
return ans;
}
}
本题需要使用优先队列。
基于大顶堆
class Solution {
public int [ ] topKFrequent ( int [ ] nums, int k) {
PriorityQueue < int [ ] > priorityQueue = new PriorityQueue < > ( ( pair1, pair2) -> pair2[ 1 ] - pair1[ 1 ] ) ;
Map < Integer , Integer > map = new HashMap < > ( ) ;
for ( int i = 0 ; i < nums. length; i++ ) {
map. put ( nums[ i] , map. getOrDefault ( nums[ i] , 0 ) + 1 ) ;
}
for ( Map. Entry < Integer , Integer > entry : map. entrySet ( ) ) {
priorityQueue. add ( new int [ ] { entry. getKey ( ) , entry. getValue ( ) } ) ;
}
int [ ] ans = new int [ k] ;
for ( int i = 0 ; i < k; i++ ) {
ans[ i] = priorityQueue. poll ( ) [ 0 ] ;
}
return ans;
}
}
基于小顶堆
class Solution {
public int [ ] topKFrequent ( int [ ] nums, int k) {
PriorityQueue < int [ ] > priorityQueue = new PriorityQueue < > ( ( pair1, pair2) -> pair1[ 1 ] - pair2[ 1 ] ) ;
Map < Integer , Integer > map = new HashMap < > ( ) ;
for ( int i = 0 ; i < nums. length; i++ ) {
map. put ( nums[ i] , map. getOrDefault ( nums[ i] , 0 ) + 1 ) ;
}
for ( Map. Entry < Integer , Integer > entry : map. entrySet ( ) ) {
if ( priorityQueue. size ( ) < k) {
priorityQueue. add ( new int [ ] { entry. getKey ( ) , entry. getValue ( ) } ) ;
} else {
if ( entry. getValue ( ) > priorityQueue. peek ( ) [ 1 ] ) {
priorityQueue. poll ( ) ;
priorityQueue. add ( new int [ ] { entry. getKey ( ) , entry. getValue ( ) } ) ;
}
}
}
int [ ] ans = new int [ k] ;
for ( int i = 0 ; i < k; i++ ) {
ans[ i] = priorityQueue. poll ( ) [ 0 ] ;
}
return ans;
}
}