哈希相关
454.四数相加II
参考文章 题目链接
个人题解
class Solution {
public int fourSumCount ( int [ ] nums1, int [ ] nums2, int [ ] nums3, int [ ] nums4) {
Map < Integer , Integer > map = new HashMap < > ( ) ;
int res = 0 ;
for ( int i = 0 ; i < nums1. length; i++ ) {
for ( int j = 0 ; j < nums2. length; j++ ) {
int key = nums1[ i] + nums2[ j] ;
map. put ( key, map. getOrDefault ( key, 0 ) + 1 ) ;
}
}
for ( int i = 0 ; i < nums3. length; i++ ) {
for ( int j = 0 ; j < nums4. length; j++ ) {
res += map. getOrDefault ( 0 - nums3[ i] - nums4[ j] , 0 ) ;
}
}
return res;
}
}
383. 赎金信
参考文章 题目链接
个人题解
class Solution {
public boolean canConstruct ( String ransomNote, String magazine) {
if ( ransomNote. length ( ) > magazine. length ( ) ) {
return false ;
}
int [ ] arr = new int [ 26 ] ;
for ( int i = 0 ; i < magazine. length ( ) ; i++ ) {
arr[ magazine. charAt ( i) - 'a' ] += 1 ;
}
for ( int i = 0 ; i < ransomNote. length ( ) ; i++ ) {
arr[ ransomNote. charAt ( i) - 'a' ] -= 1 ;
}
for ( int i = 0 ; i < arr. length; i++ ) {
if ( arr[ i] < 0 ) {
return false ;
}
}
return true ;
}
}
15. 三数之和
参考文章 题目链接
个人题解
class Solution {
public List < List < Integer > > threeSum ( int [ ] nums) {
Arrays . sort ( nums) ;
List < List < Integer > > res = new ArrayList < > ( ) ;
for ( int i = 0 ; i < nums. length; i++ ) {
if ( nums[ i] > 0 ) {
return res;
}
if ( i > 0 && nums[ i] == nums[ i - 1 ] ) {
continue ;
}
int left = i + 1 ;
int right = nums. length - 1 ;
while ( left < right) {
int sum = nums[ i] + nums[ left] + nums[ right] ;
if ( sum < 0 ) {
left++ ;
} else if ( sum > 0 ) {
right-- ;
} else {
res. add ( Arrays . asList ( nums[ i] , nums[ left] , nums[ right] ) ) ;
while ( left < right && nums[ right] == nums[ right - 1 ] ) {
right-- ;
}
while ( right > left && nums[ left] == nums[ left + 1 ] ) {
left++ ;
}
left++ ;
right-- ;
}
}
}
return res;
}
}
18. 四数之和
参考文章 题目链接
个人题解
class Solution {
public List < List < Integer > > fourSum ( int [ ] nums, int target) {
Arrays . sort ( nums) ;
List < List < Integer > > res = new ArrayList < > ( ) ;
for ( int i = 0 ; i < nums. length; i++ ) {
if ( nums[ i] > 0 && nums[ i] > target) {
return res;
}
if ( i > 0 && nums[ i] == nums[ i - 1 ] ) {
continue ;
}
for ( int j = i + 1 ; j < nums. length; j++ ) {
if ( j > i + 1 && nums[ j] == nums[ j - 1 ] ) {
continue ;
}
int left = j + 1 ;
int right = nums. length - 1 ;
while ( left < right) {
int sum = nums[ i] + nums[ j] + nums[ left] + nums[ right] ;
if ( sum < target) {
left++ ;
} else if ( sum > target) {
right-- ;
} else {
res. add ( Arrays . asList ( nums[ i] , nums[ j] , nums[ left] , nums[ right] ) ) ;
while ( left < right && nums[ right] == nums[ right - 1 ] ) {
right-- ;
}
while ( right > left && nums[ left] == nums[ left + 1 ] ) {
left++ ;
}
left++ ;
right-- ;
}
}
}
}
return res;
}
}