【数组——LeetCode刷题笔记C++】持续更新

本文档详细解析了LeetCode及剑指Offer中的经典算法题目,包括两数之和、数组中的逆序对等,涵盖了哈希表、双指针、排序、二分查找等多种算法技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为自己刷题的一个笔记记录,顺便复习一下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;
                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值