作为自己刷题的一个笔记记录,顺便复习一下C++的知识。
大概会按类似的算法思想总结,无法归类的题我就单独分一类了。
代码有的是自己写的,有的是力扣官方题解,有的是以下链接的题解。刷题顺序也是按以下链接的博主总结的顺序来写的。
【LeetCode & 剑指offer 刷题笔记】汇总(已完成)_wikiwen的博客-CSDN博客_leetcode 剑指offer
数组
1.【哈希表】两数之和。
用哈希表,增加效率。遍历1遍数组,在哈希表中找target-num[i],找不到就把该数放入哈希表中,找到就返回num[i],target-num[i],【题号1】。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hashtable;
for(int i=0;i<nums.size();i++)
{
auto it=hashtable.find(target-nums[i]);
if(it!=hashtable.end())//找到了
{
return {it->second,i};
}
hashtable[nums[i]]=i;
}
return {};
}
};
变式1:两个数组的交集。
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 题号:349
思路:将一个数组存储到set中,然后遍历另一个数组中的元素是否包含在set中,如果存在加入结果集合,并去除该数,避免重复
class Solution
{
public :
vector < int > intersection ( vector < int >& nums1 , vector < int >& nums2 )
{
if ( nums1 . empty () || nums2 . empty ()) return {};
unordered_set <int> m(nums1.begin(), nums1.end()); //vector转set,避免重复
vector < int > res ;
for ( auto a : nums2 )
{
if ( m . count ( a ))
{
res . push_back ( a );
m . erase ( a ); //去除该数
}
}
return res ;
}
};
2.【双指针】有序数组,给定目标数,找两数和为该目标。
双指针,一个指针是最小的,另一个是最大的。【题号167】,【剑指offer57】
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left=0,right=numbers.size()-1;
while(left<right){
if(numbers[left]+numbers[right]<target)
left++;
else if(numbers[left]+numbers[right]>target)
right--;
else
return {left+1,right+1};
}
return{};
}
};
变式1:搜索二叉树,先先序遍历获得其有序的结果,再用双指针。【题号653】
变式2:输入一个target,输出和为目标的所有连续正整数序列。比如t=9,返回[[2,3,4],[4,5]]。【剑指offer57】
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> result;
int l=1,r=2;
while(l<r){ //滑动窗口的思想
int cursum=(l+r)*(r-l+1)/2;//两个指针之间所有数之和。
if(cursum<target) //该窗口的值小于目标值
r++; //右指针向右滑动
else if(cursum>target)//该窗口的值大于目标值
l++; //左指针向右滑动
else{//该窗口值等于目标值
vector<int> temp;
for(int i=l;i<=r;i++){
temp.emplace_back(i);//将该窗口值存储
}
result.emplace_back(temp);//将该数组存储
l++;//左指针向右滑动
}
}
return result;
}
};
变式3:3数之和,给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。【剑指offer007】
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(),nums.end()); //先排序
int n=nums.size();
for(int first=0;first<n;first++)
{
if(first>0 && nums[first]==nums[first-1])//保证不重复处理相等的两个数
continue;
int target=-nums[first];//转换为两数之和问题,
int second=first+1;
int third=n-1;
while(second<third)//双指针
{
//保证不重复处理两个相等的数
if(second>first+1 && nums[second]==nums[second-1])
{
second++;
continue;