hash表

作者: 徐振杰 | 来源:发表于2019-05-11 15:32 被阅读0次

和为k的子数组

int sum[20020];
//先求前缀和再用hash表遍历
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        
        for(int i=0;i<nums.size();i++){
            sum[i+1] = sum[i]+nums[i];
        }
        unordered_map<int,int> um;
        int res =  0;
        for(int i=0;i<=nums.size();i++){
            if(um.count(sum[i]-k))
                res += um[sum[i]-k];
            um[sum[i]]++;
        }
        return res;
        
    }
};

连续数组

//把所有的0改成-1,然后就和上题一样去找和为1的连续数组,就是先求前缀和在用hash表遍历
int sums[50050];

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        int n = nums.size();
        for(int i=0;i<n;i++)
            if(!nums[i])
                nums[i] = -1;
        
        for(int i=0;i<n;i++){
            sums[i+1] = sums[i] + nums[i];
        }
        unordered_map<int,int> um;
        int res = 0;
        for(int i=0;i<=n;i++){
            if(um.count(sums[i])){
                
                res = max(res,i-um[sums[i]]);
            }
            else
                um[sums[i]] = i;
        }
        return res;
    }
};

雪花雪花雪花
算出雪花旋转和翻转的最小表示,然后去这两个最小表示中的最小序列,再将其排序,二维数组的排序可以用一维数组索引替代,之后对比前两个如果相同,那么就说明雪花是相同的

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
int s[N][6],idx[N];

bool cmp_min(int a[],int b[]){
    for(int i=0;i<6;i++){
        if(a[i]<b[i]) return true;
        else if(a[i]>b[i]) return false;
    }
    return false;
}

bool cmp(int a,int b){
    return cmp_min(s[a],s[b]);
}

void get_min(int snow[]){
    static int b[12];
    for(int i=0;i<12;i++) b[i] = snow[i%6];
    int i = 0,j = 1,k;
    
    while(i<6&&j<6){
        for(k=0;k<6&&b[i+k]==b[j+k];k++);
        if(b[i+k]>b[j+k]){
            i = i + k+1;
            if(i==j) i++;
        }
        else{
            j = j + k + 1;
            if(i==j) j++;
        }
    }
    int res = min(i,j);
    for(int i = 0;i<6;i++) snow[i] = b[res+ i];
}

int main(){
    int n;
    cin>> n;
    int snow[6],isnow[6];
    for(int i=0;i<n;i++){
        for(int j=0,k=5;j<6,k>=0;j++,k--){
            cin>>snow[j];
            isnow[k] = snow[j];
        }
        
        get_min(snow);
        get_min(isnow);
        
        if(cmp_min(snow,isnow)) memcpy(s[i],snow,sizeof(snow));
        else memcpy(s[i],isnow,sizeof(isnow));
        
        idx[i] = i;
    }
    
    sort(idx,idx+n,cmp);
    
    int flag = 0;
    for(int i=1;i<n;i++){
        if(!cmp_min(s[idx[i]],s[idx[i-1]])&&!cmp_min(s[idx[i-1]],s[idx[i]])){
            flag = 1;
            break;
        }
    }
    if(flag) cout<<"Twin snowflakes found."<<endl;
    else cout<<"No two snowflakes are alike."<<endl;

    return 0;
}

相关文章

  • 面试准备——HashMap原理

    Hash表 Hash表的结构就是顺序表+链表的结构Hash表(jdk1.7)中内部是HashMapEntry

  • HashMap 源码理解

    基础 Node定义 table hash表,Node数组。 size: hash表中Node节点总数,与hash...

  • Redis 字典

    Redis 字典使用Hash 表作为底层的实现,Hash 表这个结构不难理解,但是在实际应用 Hash 表时,当数...

  • 机试常用算法和题型-哈希专题

    哈希专题 hash表的用法 hash表高阶用法,二维数组存放不同组的hash值 hash结合字母表处理字符串的使用方法

  • 什么是哈希(Hash)表

    什么是哈希(Hash)表 Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表...

  • 数据结构-Hash

    1. 什么是Hash表 先看一下hash表的结构图: 数组 + 链表 哈希表(Hash table,也叫散列表),...

  • 笔记-数据结构之 Hash(OC的粗略实现)

    什么是Hash表 先看一下hash表的结构图: 数组 + 链表 哈希表(Hash table,也叫散列表),是根据...

  • 数据结构-Hash

    1. 什么是Hash表 先看一下hash表的结构图: 数组 + 链表 哈希表(Hash table,也叫散列表),...

  • 命令使用

    一、date 二、关机或重启系统 三、alias:别名 四、hash: hash:查看hash表(表中记录了查找到...

  • Hash表

    散列函数:一个把查找表中的关键字映射称对应的地址的函数,记为Hash(key)=Addr(这里的地址也可以看作数组...

网友评论

      本文标题:hash表

      本文链接:https://www.haomeiwen.com/subject/hoctaqtx.html