程式碼隨想錄演算法訓練營第六天| 242. 有效的字母異位詞、349.兩個陣列的交集、202.快樂數、1.兩數之和

清源风起时發表於2024-06-26

242題思路就是分別遍歷兩個單詞,統計字母數量看看是否一致。

 1 class Solution {
 2 public:
 3     bool isAnagram(string s, string t) {
 4         vector<int>tmp1(26);
 5         int len1 = s.size();
 6         int len2 = t.size();
 7         if(len1!=len2){
 8             return false;
 9         }
10         for(int i=0;i<len1;i++){
11             tmp1[s[i]-'a']++;
12             tmp1[t[i]-'a']--;
13         }
14         for(int k=0;k<26;k++){
15             if(tmp1[k]!=0){
16                 return false;
17             }
18         }
19         return true;
20     }
21 };

349題的程式碼基本全部看不懂,貼一下原文程式碼吧

 1 class Solution {
 2 public:
 3     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 4         unordered_set<int> result_set; // 存放結果,之所以用set是為了給結果集去重
 5         unordered_set<int> nums_set(nums1.begin(), nums1.end());
 6         for (int num : nums2) {
 7             // 發現nums2的元素 在nums_set裡又出現過
 8             if (nums_set.find(num) != nums_set.end()) {
 9                 result_set.insert(num);
10             }
11         }
12         return vector<int>(result_set.begin(), result_set.end());
13     }
14 };
15 //這段程式碼是一個C++函式,屬於一個名為 Solution 的類,其目的是找出兩個整數陣列 nums1 和 nums2 的交集。下面我將逐行解釋這段程式碼:
16 
17 //unordered_set<int> nums_set(nums1.begin(), nums1.end());
18 //這行程式碼建立了一個名為 nums_set 的 unordered_set(無序集合)物件,它包含 nums1 陣列中的所有元素。unordered_set 是一種容器,類似於 vector,但它不允許重複的元素,並且元素的迭代順序是不確定的。nums1.begin() 和 nums1.end() 是迭代器,分別指向 nums1 陣列的第一個元素和陣列之後的位置(不包括陣列的最後一個元素)。
19 
20 //for (int num : nums2) {
21 //這是一個基於範圍的for迴圈(range-based for loop),是C++11引入的新特性。這種迴圈的語法糖使得遍歷容器變得非常簡潔。這裡的意思是,對於 nums2 中的每個元素 num,執行花括號 {} 內的程式碼塊。
22 
23 //if (nums_set.find(num) != nums_set.end()) {
24 //這行程式碼檢查當前遍歷到的元素 num 是否存在於 nums_set 中。nums_set.find(num) 會返回一個迭代器,指向 nums_set 中與 num 相等的元素。如果 num 不在 nums_set 中,find 函式將返回 nums_set.end(),這是一個指向 nums_set 結束之後的迭代器。
25 
26 //result_set.insert(num);
27 //如果 num 在 nums_set 中找到了,這行程式碼將 num 插入到另一個 unordered_set 物件 result_set 中。由於 unordered_set 不允許重複元素,如果 num 已經被插入,它不會被再次插入。
28 
29 //return vector<int>(result_set.begin(), result_set.end());
30 //這行程式碼將 result_set 轉換成一個 vector(向量),並返回這個向量。vector<int>(result_set.begin(), result_set.end()) 是一種初始化 vector 的方式,它包含了 result_set 中的所有元素。
31 
32 //總的來說,這段程式碼的目的是找出兩個陣列的交集,並將結果儲存在一個 vector 中返回。它使用了 unordered_set 來快速檢查元素是否存在,並利用基於範圍的for迴圈來簡化程式碼。
 1 //只能算默寫了一遍 完全是新學的規範
 2 //確實 沒有限制單個元素數值的大小 不能用常規的陣列來處理
 3 class Solution {
 4 public:
 5     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
 6         unordered_set<int> ans;
 7         unordered_set<int> tmp(nums1.begin(),nums1.end());
 8         for (int num : nums2) {
 9             if (tmp.find(num) != tmp.end()) {
10                 ans.insert(num);
11             }
12         }
13         vector<int> res(ans.begin(),ans.end());
14         return res;
15     }
16 };

202題我是常規求餘數相加

 1 class Solution {
 2 public:
 3     bool isHappy(int n) {
 4         unordered_set<int> tmp;
 5         int sum = 0;
 6         int num = n;
 7         int div;
 8         int remainder;
 9         while (num) {
10             while (num != 0) {
11                 div = num/10;
12                 remainder = num%10;
13                 sum += remainder*remainder;
14                 num = div;
15             }
16             if (sum == 1) {
17                 return true;
18             }
19             if (tmp.find(sum) == tmp.end()) {
20                 tmp.insert(sum);
21             } 
22             else {
23                 return false;;
24             }
25             num = sum;
26             sum = 0;
27         }  
28     return false;
29     }
30 };

但是看題解有很有意思的快速求各位平方和的做法,還挺有趣的。

1 int calculateNum(int n){
2         string str = to_string(n);
3         int res = 0;
4         for (char i:str){
5             int num = i - '0';
6             res = res + num*num;
7         }
8         return res;
9     }

1題上來當然是暴力解法快速帶走啊。

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         vector<int>ret(2);
 5         for (int i = 0; i < nums.size(); ++i) {
 6             for (int j = i + 1; j < nums.size(); ++j) {
 7                 if (nums[i] + nums[j] == target) {
 8                     ret[0] = i, ret[1] = j;
 9                     return ret;
10             }
11         }
12     }
13     return ret;
14     }
15 };

好吧,步入正題,想想怎麼用雜湊表的知識解決。

 1 //排序後 從小到大排序 然後左右開始遍歷相加 這樣時間複雜度是O(n) 排序的時間複雜度是O(logn) 相加也是比O(n^2)小的
 2 //但是這樣的話,下標會亂,我需要一個東西,可以把下標和對應的數值存進去 就是你了underorder_map 甚至不需要排序 直接做減法 看看裡面有沒有對應的數值即可
 3 
 4 class Solution {
 5 public:
 6     vector<int> twoSum(vector<int>& nums, int target) {
 7         vector<int>ret(2);
 8         unordered_map<int,int> map;
 9         for (int i = 0; i < nums.size(); i++) {
10             if (map.find(target - nums[i]) != map.end()) {
11                 ret[0] = i;
12                 ret[1] = map[target - nums[i]];
13                 return ret;
14             }
15             map[nums[i]] = i;
16         }
17         return ret;
18     }
19 };

相關文章