day6day7

本文介绍了在解决编程问题时如何使用哈希表、strlen、sizeof等工具,探讨了C++中的unordered_set和vector在处理数组和去重问题上的便利性,以及在解决快乐数、两数之和、四数相加等问题时的策略,包括指针操作、排序和剪枝技巧。
摘要由CSDN通过智能技术生成

这两天偷懒了

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--;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值