Day13——哈希表专题 矫情吗;* 2024-04-01 09:02 59阅读 0赞 #### 文章目录 #### * * * 26.赎金信 * 27.三数之和 * 28.四数之和 -------------------- #### 26.赎金信 #### **思路:** 用哈希映射数组来解决这道问题,首先先定义个数组,遍历magazine字符串,哈希映射来求出每个字符出现的次数以及位置,遍历ranomNote的字符串,在record里对应的字符个数做–操作 **实现代码:哈希解法** class Solution { public boolean canConstruct(String ransomNote, String magazine) { int [] record = new int[26]; for (char c : magazine.toCharArray()) { record[ c -'a'] += 1; } for (char c : ransomNote.toCharArray()) { record[c - 'a'] -= 1; } for (int i : record) { if(i < 0){ return false; } } return true; } } #### 27.三数之和 #### 思路:本题采用双指针方法来解决,因为涉及到去重,所以哈希法比较麻烦。先让i指向第一个元素,left指向i+1个元素,right指向最后一个元素,通过判断三者数的和sum sum>0,则右指针向左移 sum<0,则左指针向右移 sum=0,则添加集合中 **去重操作:** 判断i是否重复,就判断`nums[i]==nums[i-1];`,i+1的则是在数组中判重,就会丢失目标的集合。 判断left,right是否重复,right: **nums\[right\]==nums\[right-1\]** left: **nums\[left\]==nums\[left+1\];** **代码实现:双指针** class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if(nums[i]>0){ return result; } if (i > 0 && nums[i] == nums[i-1]){ continue; } int left = i + 1; int right = nums.length - 1; while (right>left){ int sum = nums[i]+nums[left]+nums[right]; if(sum>0){ right--; }else if(sum<0){ left++; }else { result.add(Arrays.asList(nums[i],nums[left],nums[right])); while (right>left && nums[right]==nums[right-1]) { right--; } while (right>left && nums[left]==nums[left+1]) { left++; } right--; left++; } } } return result; } } #### 28.四数之和 #### \*\*思路:\*\*在三数之和的基础上,本题由一个确定的0,变成了一个目标值target 但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。 用二层for循环,之后用long类型计算sum,以免数值越界。 **代码实现:双指针** class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { // nums[i] > target 直接返回, 剪枝操作 if (nums[i] > 0 && nums[i] > target) { return result; } if (i > 0 && nums[i - 1] == nums[i]) { continue; } for (int j = i + 1; j < nums.length; j++) { if (j > i + 1 && nums[j - 1] == nums[j]) { continue; } int left = j + 1; int right = nums.length - 1; while (right > left) { long sum = (long) nums[i] + nums[j] + nums[left] + nums[right]; if (sum > target) { right--; } else if (sum < target) { left++; } else { result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; left++; right--; } } } } return result; } }
相关 Day12——哈希表专题 文章目录 23.快乐数 24.两数之和 25.四数相加 -------------------- 23 - 日理万妓/ 2024年04月03日 14:19/ 0 赞/ 78 阅读
相关 Day11——哈希表专题 文章目录 21.有效的字母异位词 22.两个数组的交集 -------------------- 21.有效的字母异位词 绝地灬酷狼/ 2024年04月03日 13:40/ 0 赞/ 63 阅读
相关 Day13——哈希表专题 文章目录 26.赎金信 27.三数之和 28.四数之和 -------------------- 26 矫情吗;*/ 2024年04月01日 09:02/ 0 赞/ 60 阅读
相关 哈希值 哈希表_哈希杰森 哈希值 哈希表 我最近写了一个[简单的库,可预测地对json进行哈希处理][json] 。 该实用程序基于出色的[Jackson Json解析库][Jackson Json 阳光穿透心脏的1/2处/ 2023年02月25日 04:56/ 0 赞/ 30 阅读
相关 哈希表 ![Center][] [Center]: /images/20220731/1379dbdc6efb4a42a0b011f0b3aa4455.png 「爱情、让人受尽委屈。」/ 2022年08月14日 04:56/ 0 赞/ 218 阅读
相关 哈希表 什么是哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的[数据结构][Link 1]。也就是说,它通过把关键码 悠悠/ 2022年07月15日 12:14/ 0 赞/ 233 阅读
相关 哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速 系统管理员/ 2022年06月10日 01:26/ 0 赞/ 288 阅读
相关 哈希表 我们知道,通过对数组进行直接寻址(Direct Addressing),可以在 O(1) 时间内访问数组中的任意元素。所以,如果存储空间允许,可以提供一个数组,为每个可能的关键 快来打我*/ 2022年06月05日 02:20/ 0 赞/ 396 阅读
相关 哈希表 一、简介 如果所有的键都是小整数,那么我们可以用一个数组来实现无序的符号表,将键作为数组的索引i而数组中i(键)处储存的就是对应的值。 这样就可以快速地访问任意键的值, 旧城等待,/ 2021年12月22日 01:21/ 0 赞/ 439 阅读
相关 哈希表 【一】哈希表 > 他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。 ![watermark_type_ZmFuZ3poZW5na 傷城~/ 2021年08月11日 17:13/ 0 赞/ 589 阅读
还没有评论,来说两句吧...