首页 > 编程语言 >代码随想录算法训练营第七天| 454. 两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和

代码随想录算法训练营第七天| 454. 两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和

时间:2024-07-04 18:33:30浏览次数:32  
标签:vector 四数 15 nums int 随想录 right ans left

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 };

许久没跟着刷题了,不说了 开工!

标签:vector,四数,15,nums,int,随想录,right,ans,left
From: https://www.cnblogs.com/zhuyishao/p/18284412

相关文章

  • 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、54.替换数字(卡码网
    344简单写个循环1classSolution{2public:3voidreverseString(vector<char>&s){4chartmp;5intlen=s.size();6for(inti=0;i<len/2;i++){7tmp=s[i];8s[i]=s[len-......
  • 代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串
    151以前写过很呆的写法但能用嘿1classSolution{2public:3stringreverseWords(strings){4//初始化变量5vector<vector<int>>data;//存储单词的起始地址和长度6stringans;//最终结果字符串7intnum=0;......
  • 【适用于各种工业应用】IMLT65R050M2H IMLT65R040M2H IMLT65R015M2H IMLT65R060M2H Co
    摘要CoolSiC™650VG2MOSFET可通过降低能耗来充分利用碳化硅的性能,从而在功率转换过程中实现更高效率。这些CoolSiC650VG2MOSFET适用于各种功率半导体应用,如光伏、能量存储、电动汽车直流充电、电机驱动器和工业电源。配备CoolSiCG2的电动汽车用直流快速充电站与前几代产品......
  • VMware vSphere Tanzu部署_15_TKG Cluster获取永不过期Token
    TKGCluster获取永不过期Token登录TKC集群$kubectlvspherelogin--server=192.168.203.194\--tanzu-kubernetes-cluster-nametkc-dev-cluster\--tanzu-kubernetes-cluster-namespacetkc-01\--vsphere-usernameadministrator@vsphere.local\--insecure-skip-tls-v......
  • CF915F Imbalance Value of a Tree
    达到今日更新量题目让我们求所有简单路径上最大值减去最小值的总和实际上就是所有简单路径的最大值总和减去所有简单路径上最小值总和然后分别求所以简单路径的极值,下面以最大值为例:我刚开始想到了非常SB的做法:枚举最大值x,设比x大的数为y,实际上有很多y,如果y是x的祖先,那么点对......
  • 代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
    有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。题977.有序数组的平方classSolution{pub......
  • 第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题-附答案
    第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题题目总数:11总分数:400真题下载点我百度网盘......
  • 小白个人向[攻防世界]wtf.sh-150( 需要Shell脚本知识 )
    wtf.sh-150(需要Shell脚本知识)注册---->登录---->是一个论坛----->我们也发文章(如上图)发现http://61.147.171.105:56056/post.wtf?post=HYBRM#,post参数好像可以修改,尝试路径穿越学习链接:https://zhuanlan.zhihu.com/p/593376086拿到网页源码网页搜索flag看到cookie和use......
  • [Leetcode]Top 150
    链表旋转链表给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defro......
  • 历年CSP-J初赛真题解析 | 2018年CSP-J初赛选择题(1-15)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客第1题以下哪一种设备属于输出设备()A.扫描仪B.键盘C.鼠标D.打印机【答案】:D【解析】A、B、C都是输入设备第2题下列......