● 自己看到題目的第一想法
242. 有效的字母異位詞
-
方法:
方法一: 暴力法1. 分別對s, t排序 2. 遍歷s與t 判斷s[i]!=t[i] 返回 false 否則 返回true
-
思路:
-
注意:
-
代碼:
bool cmp(char a, char b){return a<b;}class Solution {
public:bool isAnagram(string s, string t) {int slen = s.size();int tlen = t.size();if(slen != tlen){return false;}sort(t.begin(), t.end(),cmp);sort(s.begin(), s.end(), cmp);for(int i= 0; i<slen; i++){cout<< s[i] <<endl ;}for(int j= 0; j<tlen; j++){cout<< t[j] <<endl ;} for(int i= 0,j=0; i<slen,j<tlen; i++,j++){ if(s[i] != t[j]){cout<< s[0] <<" "<<t[0]<<endl ;cout<< s[1] <<" "<<t[1]<<endl ;return false; }}return true;}
};
-
運行結果:
-
方法二:哈希表
-
思路:
定義一個nums數組大小為26,初始值為0; 利用nums記分別錄,s中字符出現的頻次, t中字符出現的頻次 若二者頻次相同 則 return true 否則 return false;
-
注意:
-
代碼:
class Solution {
public:bool isAnagram(string s, string t) {int record[26]={0};int slen = s.size();int tlen = t.size();for(int i = 0; i<slen; i++){record[s[i] -'a']++;}for(int i =0; i<tlen; i++){record[t[i]-'a']--;}for(int i=0; i<26; i++){if(record[i] != 0){return false;}}return true;}
};
class Solution {
public:bool isAnagram(string s, string t) {map<char, int>m;for(int i =0; i<s.size(); i++){m[s[i]]++;}for(int i=0; i<t.size(); i++){m[t[i]]--;}for (auto it = m.begin(); it != m.end(); ++it) {if (it->second != 0) {return false;}}//等價于// for(auto it:map){// if(it.second !=0){// return false;// }// } return true;}
};
349. 兩個數組的交集
-
方法:哈希表
-
思路:
該題的結果是去重的, 所以 確定使用 set 或 unordered_set定義 集合 res 與 s set<int>s, res;將nums1 放在 set中, set<int>s(nums1.begin(), nums2.end());在s中查找 nums2 是否出現在 s中, 出現則將nums2插入res中 s.find(nums2) !=s.end();返回 vector<int>(res.begin(), res.end())
-
注意:
-
代碼:
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int>s(nums1.begin(), nums1.end()); set<int>res;for(auto nums: nums2){if(s.find(nums) != s.end()){res.insert(nums);}}return vector<int>(res.begin(),res.end());}
};
- 運行結果:
第202題. 快樂數
-
方法二:快慢指針
-
思路:
可能會出現的情況有兩種, 1. 一個數最終會變成1 2. 一個數最終會陷入循環 3. 一個數最終會變得無限大(排除這種,不可能出現這種情況)定義兩個指針 fast (每次走兩步) slow(每次走一步) 若fast 與slow 相遇 則 陷入循環 判斷 fast==1 若是 則返回 true 否則返回false;若不相遇 則 fast (每次走兩步) slow(每次走一步)
-
注意:
-
代碼:
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) {int slow = n;int fast = getsum(n);while(slow != fast){slow = getsum(slow);fast = getsum(getsum(fast));}if(slow==1){return true;}return false;}
};
-
方法二:哈希表
-
思路:
可能會出現的情況有兩種, 1. 一個數最終會變成1 2. 一個數最終會陷入循環 3. 一個數最終會變得無限大(排除這種,不可能出現這種情況)定義哈希表unordered_set<int>set 若 set中出現sum 則返回false, 否則將sum加入到set中; 將n賦值到下一個計算的結果 n=sum
-
注意: n要更新成下個計算的結果 即n=sum
-
代碼:
class Solution {
public:bool isHappy(int n) {unordered_set<int>set;while(1){int x= getsum(n);if(set.find(x) !=set.end()){return false;}else{set.insert(x);}n=x;if(x==1){return true;}}}int getsum(int n){int sum=0;while(n){sum += (n%10) * (n%10);n=n/10;}return sum;}
};
1. 兩數之和
-
方法一:哈希表
-
思路:
定義一個unordered_map<int, int>map, 第一個是數 第二個是下標; 在map中查找 target-nums[i] 若存在 則返回 it->second 和下標 ,否則 將nums[i] 和 i 插入map中
-
注意:
-
代碼:
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int>map;for(int i=0; i<nums.size(); i++){auto it = map.find(target-nums[i]);if(it != map.end()){return {it->second, i};}map.insert(pair<int, int>(nums[i], i));}return {};}
};
-
方法二:暴力法
-
思路:
-
注意:
-
代碼:
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>res;for(int i=0; i<nums.size(); i++){for(int j=i+1; j<nums.size(); j++){if(nums[i]+nums[j]==target){// res.push_back(i);// res.push_back(j);res.insert(res.end(),{i,j});return res;}}}return { };}
};