代码随想录算法训练营第七天| 454. 两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和
1.代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素2.代码随想录算法训练营第二天| 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 II3.代码随想录算法训练营第四天| 203. 移除链表元素、707.设计链表、206.反转链表4.代码随想录算法训练营第五天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交(同160题)、142.环形链表Ⅱ5.代码随想录算法训练营第六天| 242. 有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
6.代码随想录算法训练营第七天| 454. 两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和
7.代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、54.替换数字(卡码网是真滴不好用)8.代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串中第一个匹配项的下标、459.重复的子字符串9.代码随想录算法训练营第十一天|232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项10.代码随想录算法训练营第十二天|150.逆波兰表达式求值、239.滑动窗口最大值、347.前k个高频元素11.代码随想录算法训练营第十三天|今天量大管饱144、145、94、102、107、199、637、429、515、116、117、104、11112.代码随想录算法训练营第十四天| 226.翻转二叉树 、101. 对称二叉树、104.二叉树的最大深度 (优先掌握递归)、111.二叉树的最小深度13.代码随想录算法训练营第十五天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数454题拆成两块 各自匹配 化成两个O(n^2)运算
1 class Solution { 2 public: 3 int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) { 4 //四个数组拆分成两块 两块 5 unordered_map<int,int> sum; 6 int ans = 0; 7 for (int n1:nums1) { 8 for (int n2:nums2) { 9 sum[n1+n2]++; 10 } 11 } 12 for (int n3:nums3) { 13 for (int n4:nums4) { 14 if (sum.find(0-n3-n4) != sum.end()) { 15 ans += sum[0-n3-n4];//加上这个要求的次数 16 } 17 } 18 } 19 return ans; 20 } 21 };
383题笨方法 统计 计数
1 class Solution { 2 public: 3 bool canConstruct(string ransomNote, string magazine) { 4 unordered_map<char, int> charCount; 5 for (char t:ransomNote) { 6 charCount[t]--; 7 } 8 for (char s:magazine) { 9 charCount[s]++; 10 } 11 for (char ch = 'a'; ch <= 'z'; ++ch) { 12 if (charCount[ch] < 0) { 13 return false; 14 } 15 } 16 return true; 17 } 18 };
15题琢磨了很久 哈希表法太容易超时了 还得是双指针法啊
1 //上来就三重循环 有点难绷得住 2 //那不能三重循环 直接空间换时间? 3 //第一遍 遍历 我按下标存放 4 class Solution { 5 public: 6 vector<vector<int>> threeSum(vector<int>& nums) { 7 vector<vector<int>> ans; 8 unordered_map<int, vector<pair<int, int>>> myMap; 9 10 // 构建哈希表,存储所有满足条件的 (i, j) 组合 11 for (int i = 0; i < nums.size(); ++i) { 12 for (int j = i + 1; j < nums.size(); ++j) { 13 int sum = nums[i] + nums[j]; 14 myMap[sum].push_back({i, j}); 15 } 16 } 17 18 // 查找满足条件的三元组 (i, j, k) 19 for (int k = 0; k < nums.size(); ++k) { 20 int target = 0 - nums[k]; 21 22 if (myMap.find(target) != myMap.end()) { 23 for (auto& pair : myMap[target]) { 24 int i = pair.first; 25 int j = pair.second; 26 if (k != i && k != j) { 27 vector<int> triplet = {nums[i], nums[j], nums[k]}; 28 sort(triplet.begin(), triplet.end()); 29 ans.push_back(triplet); 30 } 31 } 32 } 33 } 34 35 // 使用 set 去重 36 set<vector<int>> unique_ans(ans.begin(), ans.end()); 37 ans.assign(unique_ans.begin(), unique_ans.end()); 38 39 return ans; 40 } 41 }; 42 //辛辛苦苦写的哈希算法 直接超时 好好好好 换到双指针法
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 vector<vector<int>> ans; 5 sort(nums.begin(), nums.end()); 6 int n = nums.size(); 7 for (int i = 0; i < n - 2; ++i) { 8 if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的元素 9 10 int left = i + 1; 11 int right = n - 1; 12 while (left < right) { 13 int sum = nums[i] + nums[left] + nums[right]; 14 if (sum == 0) { 15 ans.push_back({nums[i], nums[left], nums[right]}); 16 while (left < right && nums[left] == nums[left + 1]) left++; // 跳过重复的元素 17 while (left < right && nums[right] == nums[right - 1]) right--; // 跳过重复的元素 18 left++; 19 right--; 20 } else if (sum < 0) { 21 left++; 22 } else { 23 right--; 24 } 25 } 26 } 27 28 // sort(ans.begin(), ans.end()); 29 // ans.erase(unique(ans.begin(), ans.end()), ans.end()); 30 //这个去重操作要好好学学 不用学了 多余的 31 return ans; 32 } 33 };
18题就是15题套皮 多加一层循环
1 class Solution { 2 public: 3 vector<vector<int>> fourSum(vector<int>& nums, int target) { 4 //可不可以在三数之和基础上加一层循环 5 vector<vector<int>> ans; 6 sort(nums.begin(), nums.end()); 7 int n = nums.size(); 8 9 for (int i = 0; i < n - 3; ++i) { 10 if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的元素 11 12 for (int j = i + 1; j < n - 2; ++j) { 13 if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 跳过重复的元素 14 15 int left = j + 1; 16 int right = n - 1; 17 18 while (left < right) { 19 long long sum = static_cast<long long>(nums[i]) + nums[j] + nums[left] + nums[right]; 20 if (sum == target) { 21 ans.push_back({nums[i], nums[j], nums[left], nums[right]}); 22 while (left < right && nums[left] == nums[left + 1]) left++; // 跳过重复的元素 23 while (left < right && nums[right] == nums[right - 1]) right--; // 跳过重复的元素 24 left++; 25 right--; 26 } else if (sum < target) { 27 left++; 28 } else { 29 right--; 30 } 31 } 32 } 33 } 34 35 return ans; 36 } 37 };
许久没跟着刷题了,不说了 开工!
自在飞花轻似梦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端