这两天偷懒了
242.有效的字母异位词
第一次接触哈希表,新学习了c语言测字符长度的句式strlen和sizeof,以及他们在指针和数组情况下的区别(多一个/适用;适用/不适用)定义数组的方式也复习熟悉了 int record[26] = {0}; 另一种int*是指针类定义,学习了可以s[i]-'a'相减两个str求差。剩下的就是想到以一个数组0无1有的形式记录两个str的叠加情况。
两个数组的交集
第一题会了之后数组能想出来怎么写,(能用数组是因为大小划分好了,但是还是很多浪费空间),新学了unordered_set,c语言没有我真服了,强行学了一波c++怎么用unordered_set<int>,去重方便一比哦,新学了vector<int>(nums.begin(),nums.end())在c++里面能自动增长的“数组”——向量
第202题. 快乐数
注意审题!只有无限循环和等于一两种情况!前一题是用到去重的特点,这一题是用到快速查找的特点
学习了求各个位数平方和的方法
int getSum(int n){
int Sum = 0;
while(n){
Sum+=(n%10)*(n%10);
n/=10;
}
return Sum;
}
使用set的关键字眼“无限循环”-->set快速查重
查找set里有没有int的句式set.find(int)!=re.end()
1. 两数之和
第一次学习unordered_map的写法,map里面的单位是unordered_map<int,int> map两个数据的pair,也是通过insert插入map.insert(pair<int,int>(nums[i],i));第一个是key(x输入)第二个是value(y输出),取value值是map.find(nums[i])->second,新学了auto类型是C++里面自动定义的数据类型
第454题.四数相加II
这题只能n平方,思路就是用unordered_map记录前两个组的和再进入for c for d两重循环比较不然就是n三次方了,核心就是用key记录和,value记录和的次数
383. 赎金信
这种string就是设数组哈希加减抵消,我写是三个for,可以反过来先加上magazine再减去ransomNote然后当时看有没有负数直接return就只要两个for
第15题. 三数之和
这一题哈希不好做双指针,i和left=i+1和right=末位,然后大于零或小于零left右移或right左移,主要是想到sort才能想到指针求和为0,其次老是犯的一个错误就是while(left<right)老是写成while(left!=right)
这一步去重没有想到,continue也是第一次运用
错误去重a方法,将会漏掉-1,-1,2 这种情况
/*
if (nums[i] == nums[i + 1]) {
continue;
}
*/
// 正确去重a方法
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
tips:C++中length()函数只能用来获取字符串长度(用于string),类似于size()计算的是元素的个数
left和right的去重同样没想到是while
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
18. 四数之和
剪枝!去重!
在三数之和的基础上再套一层for
target负数的情况遗漏了,判断句式应该为if(nums[i]>target&&nums[i]>=0) return re;
一级剪枝没忘if(nums[i]>target&&nums[i]>=0) return re;
漏了二级剪枝(不剪overflow了)
可能会过大的int要加上一个long
if((long)nums[i]+nums[j]+nums[left]+nums[right]>target)
right--;