哈希表
两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
代码
int num1[3]={4,9,5},num2[5]={9,4,9,8,4};
int hash[1001]={0}; // 初始化哈希表
int i;
for(i=0;i<num1len;i++){
hash[num1[i]]=1; // 将一个数组的元素用哈希表记录下来
}
for(i=0;i<num2len){
if(hash[num2[i]]==1){ // 如果当前遍历元素存在于哈希表中
printf("%d ",num2[i]);
hash[num2[i]]=0; //防止输出同一元素
}
}
贪心
划分字母区间
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
代码:
char ch[25]={"ababcbacadefegdehijhklij"};
int hash[26]={0}; //初始化哈希表
int i;
for(i=0;i<len;i++){
hash[ch[i]-'a']=i; // 将每个元素的下标存放在表中,保证每次存放的是此元素的最远下标
}
int right=hash[0];
for(i=1;i<len;i++){
right=max(right,hash[ch[i]-'a']);
if(i==right){
printf("%d ",right+1);
}
}