LeetCode hot100---双指针专题(C++语言)

news/2024/10/5 0:22:12 标签: leetcode, c++, 算法

双指针

(1)快慢双指针

适用于使用双指针进行元素移动,覆盖

(2)首尾双指针

计算区域面积,三数之和

1、移动0

(1)题目描述以及输入输出

(1)题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
(2)输入输出描述:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

关键思路:
fast遍历数组,slow用于指向零。遍历时,不为0元素时,slow与fast进行swap(),都会向右移动;0时,仅fast移动。

(2)代码块

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        
        int left = 0;
        int right = 0;
        if(nums.size() == 1)
            return;
        while(right<nums.size())
        {
            if(nums[right])
            {
                swap(nums[left],nums[right]);
                left++;
            }
            right++;
        }

    }
};

2、盛水最多的容器

(1)题目描述以及输入输出

(1)题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
(2)输入输出描述:
输入:height = [1,1]
输出:1

关键思路:
首尾双指针while遍历数组,计算区域面积:(right-left)*min(height[left],height[right])
接着偏移左右双指针,height[left]<height[right],left++,找高边缘。

(2)代码块

class Solution {
public:
    int maxArea(vector<int>& height) 
    {
        int left = 0;
        int right = height.size()-1;
        int area = 0;
        int result = 0;
        while(left<right)
        {
            area = (right-left)*min(height[right],height[left]);	//计算区域高度
            result = max(area,result);
            if(height[left]<height[right])							// 找下一个高边缘
                left++;
            else
                right--;
            
            
        }
        return result;
    }
};

3、三数之和

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
(2)输入输出描述:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

关键思路:
遍历数组元素,遍历到该元素时先对元素进行去重,使用首尾双指针while计算三者相加的和,再进行首尾指针移动;
找到和为0的三元素后,插入结果,并对接下来的首尾指针进行去重,去重后指针均向中间移动。

(2)代码块

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());		// 先对数组排序
        vector<vector<int>> result;
        int left,right;
        for(int i = 0;i<nums.size();i++)
        {
            if(nums[i] > 0)
                return result;

            if(i>0 && nums[i] == nums[i-1])	// 首元素去重
                continue;
            left = i+1;
            right = nums.size()-1;
            while(left<right)
            {
                if(nums[i] + nums[left] + nums[right] > 0)	// 根据相加结果平移指针
                    right--;
                else if(nums[i] + nums[left] + nums[right] < 0)
                    left++;
                else										// 找到三数后进行去重
                {
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    while(left<right && nums[left] == nums[left+1])left++;
                    while(left<right && nums[right] == nums[right-1])right--;

                    left++;
                    right--;
                }
            }         
        }    
        return result;
    }
};

http://www.niftyadmin.cn/n/5690495.html

相关文章

07.useDefault

在 React 应用开发中,处理状态的默认值和空值情况是一个常见需求。useDefault 钩子提供了一种优雅的方式来管理状态,同时为空值(null 或 undefined)提供默认回退值。这个自定义钩子不仅简化了状态管理,还提高了代码的可读性和健壮性。以下是如何实现和使用这个自定义钩子:…

React第十章(useState)

useState useState 是一个 React Hook&#xff0c;允许函数组件在内部管理状态。 组件通常需要根据交互更改屏幕上显示的内容&#xff0c;例如点击某个按钮更改值&#xff0c;或者输入文本框中的内容&#xff0c;这些值被称为状态值也就是(state)。 使用方法 useState 接收…

oauth2授权码模式单点登录

文章目录 前言一、单点登录是什么&#xff1f;二、oauth2授权码模式单点登录流程1.流程图2. 代码相关2. 验证流程 总结 前言 oauth2 有四种模式,常用的为密码和授权码,剩下两种几乎不用 密码模式,很好理解,就是根据输入的用户名/密码进行登录认证的,最终返回一个合法token授权…

快停止这种使用U盘的行为!

前言 现在各行各业的小伙伴基本上都需要用电脑来办公了&#xff0c;你敢说你不需要用电脑办公&#xff1f; 啊哈哈哈&#xff0c;用iPad或者手机办公的也算。 有些小伙伴可能经常996&#xff0c;甚至有时候都是007。有时候到了下班时间&#xff0c;工作还没做完&#xff0c;…

Windows系统编程(二)进程与线程一

进程与线程 进程&#xff1a;直观的讲就是任务管理器中我们看到的东西。 与内核对象句柄相似的&#xff0c;进程也有进程对象句柄&#xff0c;可以进行进程的各种操作如打开关闭。 每个进程都是独立的&#xff0c;在进程启动以后系统分配彼此独立的虚拟内存&#xff0c;此时…

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

场景题1-设计redis的key和value的原则

在设计 Redis 的 key 和 value 时&#xff0c;遵循一些最佳实践和设计原则可以确保系统的性能、可扩展性和易维护性。以下是设计 Redis key 和 value 时的常见原则&#xff1a; 1.RedisKey的设计原则 1.1.简短有意义 1&#xff09;Redis 是内存数据库&#xff0c;key 越短&am…

MAE(平均绝对误差)和std(标准差)计算中需要注意的问题

一、MAE&#xff08;平均绝对误差&#xff09; 计算公式&#xff1a; yi​ 是第i个实际值y^​i​ 是第i个预测值 计算方法&#xff1a; MAE就是求实际值与预测值之间的误差&#xff0c;需要给出预测值和原始的实际值 二、std&#xff08;标准差&#xff09; 计算公式&#x…