滑动窗口
滑动窗口的最大值
class Solution {
public int [ ] maxSlidingWindow ( int [ ] nums, int k) {
if ( nums. length== 0 ) {
return nums;
} else {
int count = 0 ;
int length = nums. length- k+ 1 ;
int [ ] a= new int [ k] ;
int [ ] b= new int [ length] ;
int m= 0 ;
while ( count< length) {
for ( int i= 0 ; i< k; i++ ) {
a[ i] = nums[ i+ count] ;
}
Arrays . sort ( a) ;
b[ m++ ] = a[ k- 1 ] ;
count++ ;
}
return b;
}
}
}
class Solution {
public int [ ] maxSlidingWindow ( int [ ] nums, int k) {
if ( nums. length == 0 || k == 0 ) return new int [ 0 ] ;
Deque < Integer > deque = new LinkedList < > ( ) ;
int [ ] res = new int [ nums. length - k + 1 ] ;
for ( int j = 0 , i = 1 - k; j < nums. length; i++ , j++ ) {
if ( i > 0 && deque. peekFirst ( ) == nums[ i - 1 ] )
deque. removeFirst ( ) ;
while ( ! deque. isEmpty ( ) && deque. peekLast ( ) < nums[ j] )
deque. removeLast ( ) ;
deque. addLast ( nums[ j] ) ;
if ( i >= 0 )
res[ i] = deque. peekFirst ( ) ;
}
return res;
}
}
双指针
class Solution {
public ListNode getKthFromEnd ( ListNode head, int k) {
ListNode former = head, latter = head;
for ( int i = 0 ; i < k; i++ ) {
if ( former == null ) return null ;
former = former. next;
}
while ( former != null ) {
former = former. next;
latter = latter. next;
}
return latter;
}
}
双指针问题
class Solution {
public String reverseWords ( String s) {
s = s. trim ( ) ;
int j = s. length ( ) - 1 , i = j;
StringBuilder res = new StringBuilder ( ) ;
while ( i >= 0 ) {
while ( i >= 0 && s. charAt ( i) != ' ' ) i-- ;
res. append ( s. substring ( i + 1 , j + 1 ) + " " ) ;
while ( i >= 0 && s. charAt ( i) == ' ' ) i-- ;
j = i;
}
return res. toString ( ) . trim ( ) ;
}
}
经典滑动窗口问题
class Solution {
public int minSubArrayLen ( int s, int [ ] nums) {
int n = nums. length;
if ( n == 0 ) {
return 0 ;
}
int ans = Integer . MAX_VALUE;
int start = 0 , end = 0 ;
int sum = 0 ;
while ( end < n) {
sum += nums[ end] ;
while ( sum >= s) {
ans = Math . min ( ans, end - start + 1 ) ;
sum -= nums[ start] ;
start++ ;
}
end++ ;
}
return ans == Integer . MAX_VALUE ? 0 : ans;
}
}