代码随想录Day6(242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和)
思路:将26个字母映射到数组下标,数组中每个元素代表对应字母出现的个数。
class Solution {
public :
bool isAnagram ( string s, string t) {
int record[ 26 ] = { 0 } ;
for ( int i= 0 ; i< s. size ( ) ; i++ ) {
record[ s[ i] - 'a' ] ++ ;
}
for ( int i= 0 ; i< t. size ( ) ; i++ ) {
record[ t[ i] - 'a' ] -- ;
}
for ( int i= 0 ; i< 26 ; i++ ) {
if ( record[ i] != 0 ) {
return false ;
}
}
return true ;
}
} ;
思路:结果去重、不考虑顺序,使用unordered_set 。
class Solution {
public :
vector< int > intersection ( vector< int > & nums1, vector< int > & nums2) {
vector< int > result;
unordered_set< int > set1 ( nums1. begin ( ) , nums1. end ( ) ) ;
unordered_set< int > set2 ( nums2. begin ( ) , nums2. end ( ) ) ;
for ( int item: set1) {
if ( set2. find ( item) != set2. end ( ) ) {
result. push_back ( item) ;
}
}
return result;
}
} ;
思路:
class Solution {
public :
int getSum ( int n) {
int sum= 0 ;
while ( n) {
sum += ( n% 10 ) * ( n% 10 ) ;
n = n/ 10 ;
}
return sum;
}
bool isHappy ( int n) {
unordered_set< int > record;
while ( true ) {
int sum = getSum ( n) ;
if ( sum== 1 ) {
return true ;
}
if ( record. find ( sum) != record. end ( ) ) {
return false ;
}
else {
record. insert ( sum) ;
}
n = sum;
}
}
} ;
思路:我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
class Solution {
public :
vector< int > twoSum ( vector< int > & nums, int target) {
unordered_map< int , int > map;
for ( int i; i< nums. size ( ) ; i++ ) {
int t = target - nums[ i] ;
if ( map. find ( t) != map. end ( ) ) {
return { map[ t] , i} ;
}
map. insert ( pair < int , int > ( nums[ i] , i) ) ;
}
return { } ;
}
} ;
总结
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 哈希法可以用数组、set和map实现。