最长递增子序列 最长递增子序列
class Solution { public int lengthOfLIS ( int [ ] nums) { int n= nums. length; if ( n== 0 ) return 0 ; int [ ] dp = new int [ n] ; dp[ 0 ] = 1 ; int ans = 1 ; for ( int i= 1 ; i< n; i++ ) { dp[ i] = 1 ; for ( int j= 0 ; j<= i; j++ ) { if ( nums[ j] < nums[ i] ) { dp[ i] = Math . max ( dp[ i] , dp[ j] + 1 ) ; } } ans= Math . max ( dp[ i] , ans) ; } return ans; } public int lengthOfLIS1 ( int [ ] nums) { int n= nums. length; if ( n== 0 ) return 0 ; int [ ] dp = new int [ n+ 1 ] ; int len = 1 ; dp[ len] = nums[ 0 ] ; for ( int i= 1 ; i< n; i++ ) { int cur= nums[ i] ; if ( cur> dp[ len] ) { dp[ len+ 1 ] = cur; len++ ; } else { int pos= 0 ; for ( int j= len- 1 ; j>= 1 ; j-- ) { if ( dp[ j] < cur) { pos= j; break ; } } dp[ pos+ 1 ] = cur; } } return len; } public int lengthOfLIS2 ( int [ ] nums) { int len = 1 , n = nums. length; if ( n == 0 ) { return 0 ; } int [ ] d = new int [ n + 1 ] ; d[ len] = nums[ 0 ] ; for ( int i = 1 ; i < n; ++ i) { if ( nums[ i] > d[ len] ) { d[ ++ len] = nums[ i] ; } else { int l = 1 , r = len, pos = 0 ; while ( l <= r) { int mid = ( l + r) >> 1 ; if ( d[ mid] < nums[ i] ) { pos = mid; l = mid + 1 ; } else { r = mid - 1 ; } } d[ pos + 1 ] = nums[ i] ; } } return len; } public int findBiggerMin ( int [ ] arr, int cur) { int r= arr. length- 1 , l= 0 ; int ans= - 1 ; while ( l<= r) { int mid= ( l+ r) / 2 ; if ( arr[ mid] > cur) { ans= mid; r= mid- 1 ; } else { l= mid+ 1 ; } } return ans== - 1 ? - 1 : arr[ ans] ; } public int findSmallerMax ( int [ ] arr, int cur) { int r= arr. length- 1 , l= 0 ; int ans= - 1 ; while ( l<= r) { int mid= ( l+ r) / 2 ; if ( arr[ mid] < cur) { ans= mid; l= mid+ 1 ; } else { r= mid- 1 ; } } return ans== - 1 ? - 1 : arr[ ans] ; }
}
猜数字游戏 猜数字游戏
class Solution { public String getHint ( String secret, String guess) { int a= 0 , b= 0 ; Map < Character , Integer > secretLeft= new HashMap < > ( ) ; Map < Character , Integer > guessLeft= new HashMap < > ( ) ; for ( int i= 0 ; i< secret. length ( ) ; i++ ) { if ( guess. length ( ) > i&& secret. charAt ( i) == guess. charAt ( i) ) { a++ ; } else { secretLeft. put ( secret. charAt ( i) , secretLeft. getOrDefault ( secret. charAt ( i) , 0 ) + 1 ) ; if ( guess. length ( ) > i) { guessLeft. put ( guess. charAt ( i) , guessLeft. getOrDefault ( guess. charAt ( i) , 0 ) + 1 ) ; } } } for ( Map. Entry < Character , Integer > entry : secretLeft. entrySet ( ) ) { if ( guessLeft. containsKey ( entry. getKey ( ) ) ) { b+= Math . min ( guessLeft. get ( entry. getKey ( ) ) , secretLeft. get ( entry. getKey ( ) ) ) ; } } return a+ "A" + b+ "B" ; }
}