简单来说,哈希函数就是快速的将1个数值转换为1个哈希值,哈希值是整数,并且要保证,相同的输入得到的哈希值是一样的,如果两个不同的输入得到了相同的结果,这就是哈希值冲突。我们应该通过精心的设计去减少冲突,但是不能完全避免,如何处理冲突是一个重点,后面会详细说到。
也就是说,输入键(key),然后经过哈希函数计算,最后得到哈希值,而哈希值是整数,通过哈希值当做数组下标,得到对应的值。
输入key,经过哈希函数计算fun(key),最后得到y。要把y取余,y%arr.Length,免得超出数组最大长度,最后把y当做数组下标去访问数组里对应的值,这就是整个过程了。
按照这种思想,采用哈希技术将值存储在一块连续的存储空间中,这块连续的存储空间称为哈希表或者散列表。关键字对应的存储位置称为哈希地址或者散列地址。
区块链哈希是什么?如果是刚开始了解区块链,就需要结合“区块”的概念来一起理解了。每一个区块,包含的内容有数据信息,本区块的哈希值以及上一个区块的哈希值。区块中的数据信息,主要是交易双方的地址与此次交易数量还有交易时间信息等。而哈希值就是寻找到区块,继而了解到这些区块信息的钥匙。
代码如下:
class Solution{
public:
vector<vector<int>>threeSum(vector<int>&nums){
vector<vector<int>>result;
sort(nums.begin(),nums.end());
//找出a b c=0
//a=nums<i>,b=nums[left],c=nums[right]
for(int i=0;i<nums.size();i ){
//排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if(nums<i>>0){
return result;
}
//错误去重方法,将会漏掉-1,-1,2这种情况
/*
if(nums<i>==nums[i 1]){
continue;
}
*/
//正确去重方法
if(i>0&&nums<i>==nums[i-1]){
continue;
}
int left=i 1;
int right=nums.size()-1;
while(right>left){
//去重复逻辑如果放在这里,0,0,0的情况,可能直接导致right<=left了,从而漏掉了0,0,0这种三元组
/*
while(right>left&&nums[right]==nums[right-1])right--;
while(right>left&&nums[left]==nums[left 1])left ;
*/
if(nums<i> nums[left] nums[right]>0){
right--;
}else if(nums<i> nums[left] nums[right]<0){
left ;
}else{
result.push_back(vector<int>{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;
}
};