首页 > 其他分享 >DAY6 哈希表part02

DAY6 哈希表part02

时间:2024-07-23 16:56:22浏览次数:6  
标签:right nums DAY6 part02 int vector 四数 哈希 left

 

今日任务

●  454.四数相加II

●  383. 赎金信

●  15. 三数之和

●  18. 四数之和

●  总结

454.四数相加II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

 1 class Solution {
 2 public:
 3     int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
 4         std:: unordered_map<int,int> map;
 5         for(int a :nums1)
 6             for(int b:nums2)
 7                 map[a+b]++;
 8         
 9         int count=0;
10         for(int c:nums3)
11             for(int d:nums4)
12             {
13                 if(map.find(-c-d)!=map.end()) 
14                     count+=map[-c-d];
15             }
16         return count;
17     }
18 };

383. 赎金信

题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html

 1 class Solution {
 2 public:
 3     bool canConstruct(string ransomNote, string magazine) {
 4         int len1=ransomNote.size();
 5         int len2=magazine.size();
 6 
 7         int record[26]={0};
 8 
 9         if(len1>len2) return false;
10 
11         for(int i=0;i<len2;i++)
12         {
13             record[magazine[i]-'a']++;
14         }
15         for(int i=0;i<len1;i++)
16         {
17             record[ransomNote[i]-'a']--;
18         }
19         for(int i=0;i<26;i++)
20         if(record[i]<0) return false;
21 
22         return true;
23     }
24 };

15. 三数之和

本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html

 1 class Solution {
 2 public:
 3     vector<vector<int>> threeSum(vector<int>& nums) {
 4         vector<vector<int>> result;
 5         sort(nums.begin(), nums.end());
 6         // 找出a + b + c = 0
 7         // a = nums[i], b = nums[left], c = nums[right]
 8         for (int i = 0; i < nums.size(); i++) {
 9             // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
10             if (nums[i] > 0) {
11                 return result;
12             }
13             // 错误去重a方法,将会漏掉-1,-1,2 这种情况
14             /*
15             if (nums[i] == nums[i + 1]) {
16                 continue;
17             }
18             */
19             // 正确去重a方法
20             if (i > 0 && nums[i] == nums[i - 1]) {
21                 continue;
22             }
23             int left = i + 1;
24             int right = nums.size() - 1;
25             while (right > left) {
26                 // 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
27                 /*
28                 while (right > left && nums[right] == nums[right - 1]) right--;
29                 while (right > left && nums[left] == nums[left + 1]) left++;
30                 */
31                 if (nums[i] + nums[left] + nums[right] > 0) right--;
32                 else if (nums[i] + nums[left] + nums[right] < 0) left++;
33                 else {
34                     result.push_back(vector<int>{nums[i], nums[left], nums[right]});
35                     // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
36                     while (right > left && nums[right] == nums[right - 1]) right--;
37                     while (right > left && nums[left] == nums[left + 1]) left++;
38 
39                     // 找到答案时,双指针同时收缩
40                     right--;
41                     left++;
42                 }
43             }
44 
45         }
46         return result;
47     }
48 };

18. 四数之和

建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。 本题 思路整体和 三数之和一样的,都是双指针,但写的时候 有很多小细节,需要注意,建议先看视频。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html

 

标签:right,nums,DAY6,part02,int,vector,四数,哈希,left
From: https://www.cnblogs.com/xzdmzrc221202/p/18318926

相关文章

  • 算法笔记|Day5哈希表基础
    算法笔记|Day5哈希表基础☆☆☆☆☆leetcode242.有效的字母异位词题目分析代码☆leetcode49.字母异位词分组(待补充)题目分析代码☆leetcode438.找到字符串中所有字母异位词(待补充)题目分析代码☆☆☆☆☆leetcode349.两个数组的交集题目分析代码☆leetcode350.两......
  • 算法-代码随想录-哈希表
    有效的字母异位词思路:数组作为一个简单的哈希表,可以用来记录字符串中每个字符出现的次数。可以设置一个数组,第一轮遍历s中的字符,字符每出现一次,在数组对应位置+1。第二轮遍历t中的字符,字符每出现一次,在数组对应位置-1。最后遍历作为哈希表的数组,如果都为0,则说明每个字符出现的......
  • Day7 哈希表part2
    任务454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0思路暴力法的时间复杂度为O(n^4),我们利用dic来优化,首先用dic存储前两个......
  • 【代码随想录训练营第42期 Day6打卡 LeetCode 242.有效的字母异位词 349.两个数组的交
    目录一、序言二、哈希表的相关知识1.基本概念2.常见的哈希结构3.总结三、题目及其题解242.有效的字母异位词题目链接题解思路1思路2思路3349.两个数组的交集题目链接题解202.快乐数题目链接题解1.两数之和题目链接题解思路1思路2四、小结一、序言......
  • 字符串 & 哈希
    由于笔者不常使用哈希,且整理不够全面,本文只做启发。哈希寻找一个映射函数\(f\)把一个集合映射到一个有限集合,使得不同元素映射的值不同,相同元素的值相同。我们希望这个函数能让我们快速判断两个字符串是否相同。构造字符串的哈希一般构造如下:template<unsignedbas=131,u......
  • 代码随想录day6 | 242 有效字母异位词 349 两个数组交际 202 快乐数 1 两数之和
    hash表遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法242判断字母异位词关于字符串的遍历问题//什么情况下遍历的是rune[]int36类型,什么情况下遍历的是char字节类型?s:="Hello,世界"fori,r:=ranges{ fmt.Printf("Index:%d,Rune:%c,......
  • Day6 哈希表part1
    目录哈希表任务242.有效的字母异位词思路349.两个数组的交集思路202.快乐数思路1.两数之和思路总结哈希表什么时候用哈希表呢?快速判断元素是否在集合中,或者元素去重(集合),或者统计重复元素的数量(字典)。任务242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t......
  • 代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数
    代码随想录训练营Day4打卡链表part02一、力扣24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]算法思路:引入虚......
  • Pandas 哈希表给出 key error:0 和 get_item
    我试图获取两个pandas数据表的相同元素,对数据进行索引并将其合并。我将它用于大量数据(数百万)。第一个表(df)是恒定的,第二个表(d2)在每个循环中都在变化,新元素将与第一个表合并。这是我的此过程的代码:df=pd.read_csv("inputfile.csv",header=None)d1=pd.DataFram......
  • DAY4 链表part02
     今日任务● 24.两两交换链表中的节点● 19.删除链表的倒数第N个节点● 面试题02.07.链表相交● 142.环形链表II● 总结  //有一定难度,需要好好琢磨24.两两交换链表中的节点用虚拟头结点,这样会方便很多。题目链接/文章讲解/视频讲解:https://progr......