LeeCode哈希问题(二)
LeeCode 454: 四数相加II
题目描述
给你四个整数数组
nums1
、nums2
、nums3
和nums4
,数组长度均为n
,请你计算有多少个元组 (i, j, k, l) 能满足:
- \(0 \le i, j, k, l < n\)
- \(nums[i] + nums[j] + nums[k] + nums[l] == 0\)
标签:数组,哈希
时间复杂度:\(O(N^2)\)
建立模型
- 使用一个哈希表保存
nums1
和nums2
出现的两数之和以及次数 - 计算
nums3
和nums4
的两数之和,并在哈希表中寻找nums3
和nums4
和的相反数 - 统计步骤二中找到的次数
代码实现
# Python3 实现
def solution(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
dict = {}
for i in nums1:
for j in nums2:
dict[i + j] = dict.get(i + j, 0) + 1
res = 0
for k in nums3:
for l in nums4:
if -(k + l) in dict:
res += dict.get(-(k + l))
return res
// Java 实现
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> map = new HashMap<>();
for (int i : nums1) {
for (int j : nums2) {
map.put(i + j, map.getOrDefault(i + j, 0) + 1);
}
}
int res = 0;
for (int k : nums3) {
for (int l : nums4) {
if (map.containsKey(-(k + l))) {
res += map.get(-(k + l));
}
}
}
return res;
}
LeeCode 383: 赎金信
题目描述
给你两个字符串:
ransomNote
和magazine
,判断ransomNote
能不能由magazine
里面的字符构成。如果可以则返回
true
,否则返回false
。magazine
中的每个字符只能在ransomNote
中使用一次。
标签:字符串,哈希
时间复杂度:O(N)
建立模型
- 遍历
magezine
统计出现的字符及次数,并保存在哈希表中 - 遍历
ransonNote
字符串,每个字符出现一次,则将哈希表中对应次数减1 - 若哈希表出现某个字符数小于0,则说明不能由
magazine
构成,返回false
- 若遍历完成未出现步骤3的情况,则返回
true
代码实现
# Python3 实现
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
dict = {}
for ch in magazine:
dict[ch] = dict.get(ch, 0) + 1
for ch in ransomNote:
dict[ch] = dict.get(ch, 0) - 1
if dict[ch] < 0:
return False
return True
// Java 实现
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<>();
for (char ch : magazine.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
for (char ch : ransomNote.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) - 1);
if (map.get(ch) < 0) {
return false;
}
}
return true;
}
LeeCode 15: 三数之和
题目描述
给你一个包含
n
个整数的数组nums
,判断nums
中是否存在三个元素 a, b, c, 使得 \(a + b + c = 0\)?请你找出所有和为 0 且不重复的三元组。
标签:数组,双指针,排序
时间复杂度:\(O(N^2)\)
建立模型
- 对 nums 数组做升序重排
- 如果数组的长度小于3 或 重排后第一个数大于0,则直接返回空数组
- 循环遍历数组中的元素(index),使其为3元组的第1个数
- 则第2个数(left)设为 index + 1,第3个数(right)设为 len(nums) - 1
- 若 \(index + left + right < 0 \Rightarrow left += 1\)
- 若 \(index + left + rigght > 0 \Rightarrow right -= 1\)
- 若 \(index + left + right == 0 \Rightarrow\) 该3元组为其中一个解
如何去除重复三元组
- 对于三元组的第一个数,\(nums[index] == nums[index - 1] \rightarrow continue\)
- 对于三元组的第二个数,\(nums[left] == nums[left + 1] \rightarrow left += 1\)
- 对于三元组的第三个数,\(nums[right] == nums[right - 1] \rightarrow right -= 1\)
代码实现
# Python3 实现
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort()
if len(nums) < 3 or nums[0] > 0:
return res
for index in range(len(nums)):
if index > 0 and nums[index] == nums[index - 1]:
continue
temp, left, right = nums[temp], index + 1, len(nums) - 1
if temp + nums[left] + nums[right] < 0:
left += 1
elif temp + nums[left] + nums[right] > 0:
right -= 1
else:
res.append([temp, nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
ledt += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return res
// Java 实现
public List[List[Integer]] threeSum(int[] nums) {
Arrays.sort(nums);
if (nums.length < 3 || nums[0] > 0) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i - 1])
continue;
int temp = nums[i];
int left = i + 1, right = nums.length - 1;
while (left < right) {
if (temp + nums[left] + nums[right] < 0) {
left += 1;
}
else if (temp + nums[left] + nums[right] > 0) {
right -= 1;
}
else {
List<Integer> list = new ArrayList<>();
list.add(temp);
list.add(nums[left]);
list.add(nums[right]);
res.add(new ArrayList<>(list));
while (left < right && nums[left] == nums[left + 1])
left += 1;
while (left < right && nums[right] == nums[right - 1])
right -= 1;
left += 1;
right -= 1;
}
}
}
return res;
}
LeeCode 18: 四数之和
题目描述
给你一个由
n
个整数组成的数组nums
,和一个目标值target
。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]]
:
- \(0 \le a, b, c, d < n\)
- \(a, b, c, d\)互不相同
- \(nums[a] + nums[b] + nums[c] + nums[d] == target\)
核心思想:该题的思路和三数之和完全一致,只是在外面多嵌套一层循环,所有时间复杂度是\(O(N^3)\)
代码实现
# Python3 实现
def solution(self, nums: List[int], target: int) -> List[List[int]]:
res = []
if len(nums) < 4:
return res
nums.sort()
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i - 1]:
continue
if 4 * nums[i] > target:
continue
for j in range(i + 1, len(nums)):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
if nums[i] + 3 * nums[j] > target:
break
left, right = j + 1, len(nums) - 1
while left < right:
if nums[i] + nums[j] + nums[left] + nums[right] < target:
left += 1
elif nums[i] + nums[j] + nums[left] + nums[right] > target:
right -= 1
else:
res.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left, right = left + 1, right - 1
return res
LeeCode哈希问题(二)的更多相关文章
- 【PAT甲级】1078 Hashing (25 分)(哈希表二次探测法)
题意: 输入两个正整数M和N(M<=10000,N<=M)表示哈希表的最大长度和插入的元素个数.如果M不是一个素数,把它变成大于M的最小素数,接着输入N个元素,输出它们在哈希表中的位置(从 ...
- Hash哈希(二)一致性Hash(C++实现)
一致性Hash 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,经常用于分布式.负载均衡等. 原理 一致哈希是 ...
- Delphi 中的哈希表(二)—— TStringHash
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- leecode第六十二题(不同路径)
class Solution { public: int uniquePaths(int m, int n) { ||n==) ; vector<vector<int>> pa ...
- PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突
Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...
- leecode第二百九十二题(Nim游戏)
class Solution { public: bool canWinNim(int n) { )==)//用与的时候,要注意优先级问题 //用n%4==0的时候,其耗时比用&短,但是空间消 ...
- leecode第一百四十二题(环形链表II)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置
Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...
- 全面了解一致性哈希算法及PHP代码实现
在设计一个分布式系统的架构时,为了提高系统的负载能力,需要把不同的数据分发到不同的服务节点上.因此这里就需要一种分发的机制,其实就是一种算法,来实现这种功能.这里我们就用到了Consistent Ha ...
- 19.-哈希算法&注册登录
一.哈希算法 哈希: 给定明文-计算出一段定长的-不可逆的值 定长输出:不管明文输入多少,哈希都是定长的 不可逆:无法反向计算出对应的明文 雪崩效应:输入改变,输出必然变 md5:32位16进制 ...
随机推荐
- cesium 學習計劃
上篇已经将cesium环境搭建完成,并且服务启动完成,进去后主要浏览 documents 文档和Sandcastle 示例. 学习计划:沙盒示例学习一遍,每个示例中的查看对应代码接口. 学习cesiu ...
- 北京金橙子ezcad2和lmc1控制卡二次开发的动态连接库手册
我要吐槽一下金橙子打电话过去一问三不答.要个手册2.0的不给,只给3.0的.而且态度角度***钻,想尽一切办法让你自己用不了.我又不是要做打标卡,只是做个二次开发.有必要这样吗?反正我是不会推荐用户再 ...
- 关于 ubuntu 22 desktop 安装 网易云音乐无法启动解决办法
- 报错现象 /opt/netease/netease-cloud-music/netease-cloud-music: /opt/netease/netease-cloud-music/libs/l ...
- C/C++ 数据结构单链表的实现(初始化、插入、删除、销毁)
#include <iostream> #include <Windows.h> #define MAX_SIZE 100 using namespace std; //单链表 ...
- Oracle数据库安装时,安装报错ins_emagent.mk
安装oracle数据库过程中,通过图形界面安装,出现ins_emagent.mk报错提示 解决方法 修改$ORACLE_HOME/sysman/lib/ins_emagent.mk,将$(MK_EMA ...
- 安装Win11需要网络才能下一步怎么跳过
1.先Shift+F10打开命令提示符 2.运行C:\Windows\System32\oobe\BypassNRO.cmd 3.自动重启来到联网这一步,多了一个没有网络的选项,进入.
- C++ accumulate()函数的用法
accumulate定义在 numeric 中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理. 头文件 #include <numeric> 原型 默认求累加和 templat ...
- python练习--1
ID_CARD = input("Input your ID Card: ") length = len(ID_CARD) if length < 5: NEW_ID_CAR ...
- svn提交规范
本文档参考了Git提交规范,旨在规范使用SVN进行代码版本管理时的提交操作. 提交前的准备 1. 检查代码 在提交代码前,请先进行必要的代码检查,确保代码的正确性.可读性和可维护性.可以使用代码质量管 ...
- 【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
问题描述 使用Azure Kubernetes服务(AKS),可以通过kubectl连接 pod 中查看日志,但是如何来查看节点的系统日志呢?如是否有ubuntu系统升级的记录? 问题解答 是的,可以 ...