优选算法[1]

目录

1.双指针;

2.滑动窗口;

3.二分查找;

4.前缀和;


1.双指针;

包括对撞指针和快慢指针(一般用来循环);

题目类型:移动零,复写零,快乐数,盛水最多的容器,有效三角形的个数,三数之和,四数之和。

举个例子:

移动零:

首先考虑暴力方法:直接遇到0元素插入到数组结尾。

优选之后:使用两个指针 (记录下标,并非真正的指针);cur和dest。

cur如果遇到0元素就++,非零元素就和dest进行交换,交换之后dest++;直到cur走到结尾。

代码编写:

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

复写零:

如果指针此c前面开始复写会造成数据被覆盖的问题,那么采用从后面到前面的方法。

首先进行移动指针,cur遇到非零移动一步,dest移动一步,cur遇到零移动一步,dest移动两步。

还有特殊情况dest跳出边界了;就把 arr[dest-1]=0;dest-=2;cur-=1;

看cur的值是否为0,非零就将cur的值直接赋值给dest,是零就赋值两次给dest。直到cur遍历完。

代码编写:

class Solution 
{
public:void duplicateZeros(vector<int>& arr) {int dest=-1;int cur=0;int n=arr.size();//将指针移动尾部while(cur<n){if(arr[cur]){dest++;}else{dest+=2;}if(dest >= n-1) break;cur++;}//处理边界,可能跳出范围了if(dest == n){arr[dest-1]=0;dest-=2;cur--;}while(cur >= 0){if(arr[cur]){arr[dest--]=arr[cur--];    }else{arr[dest--]=0;arr[dest--]=0;cur--;}}}
};

三数之和:

采用双指针的方法,首先固定一个数,只要找到和这个数相反的数之和就可以找到其他两个数。

那么就在 [i+1,n-1]之间进行查找。如果其和大于 t 那么就要将右边指针移动后一步;如果其和小于 t 那么就要将左边指针移动前一步。找到也不能停止,看是否有其他选择。

那么这里就会涉及到两个去重的操作。首先是left和right区间的去重,和上一次一样的数就直接跳过即可。外面固定的数也是一样的去重操作。

上代码:

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {int n=nums.size();vector<vector<int>> ret;//先进行排序sort(nums.begin(),nums.end());for(int i=0;i<n;){int left=i+1;int right=n-1;int target=-nums[i];while(left < right){int sum=nums[left]+nums[right];if(sum < target){left++;}else if(sum > target){right--;}else{//如果找到那么就插入ret,并且往后面看看,找到不同的解,如果有重复元素就跳过。ret.push_back({nums[i],nums[left],nums[right]});right--;left++;//跳过步骤while(left < right && nums[left]==nums[left-1]) left++;while(left <right &&nums[right]==nums[right+1])right--;}}i++;//i也是看重复元素.这个很考验能力,到底写哪里很重要。while(i < n && nums[i]==nums[i-1]) i++;}return ret;}
};

2.滑动窗口;

题目类型:长度最小的子数组,无重复字符的最长子串,最大连续1的个数,将x减少到零的最小操作数,。题目就是找进入窗口,出窗口,更新数据。

长度最小的子数组:

left和right,sum+=right的值,并且与 t 比较,len记录长度,大于t的话出窗口,更新len=right-left+1;并且left++。

上代码:

class Solution 
{
public:int minSubArrayLen(int target, vector<int>& nums) {//滑动窗口的题目就是1.进入窗口,2.出窗口,3.更新结果;//多看过程;int left=0,right=0;int len=INT_MAX;int sum=0;//while循环进不去;for循环简单。for(int left=0,right=0;right<nums.size();right++){//不进窗口就right++并且sum+;sum+=nums[right];//进窗口就判断小于,不断修改len以及sum.直到出去窗口;//相当于两层循环。while(sum >= target){len=min(len,right-left+1);sum-=nums[left++];}}return len==INT_MAX?0:len;}
};

  

3.二分查找;

定义left和right的指针。

分为朴素二分和复杂二分。

左右指针以及中间指针进行移动,来查找数据。

注意分析left,right,mid的取值。结束条件。

二分查找:

class Solution 
{
public:int search(vector<int>& nums, int target) {int left =0,right=nums.size()-1;while(left <= right){int mid=left+(right-left)/2;if(nums[mid] < target){left=mid+1;}else if(nums[mid] > target){right=mid-1;}else{return mid;}}return -1;}
};

 复杂二分:

class Solution 
{
public:vector<int> searchRange(vector<int>& nums, int target){if(nums.size()==0) return {-1,-1};//找左端点;int begin=0;int left=0,right=nums.size()-1;while(left < right)//自己画图分析是否等于{int mid=left+(right-left)/2;//自己分析;if(nums[mid] < target){left=mid+1;}else {right=mid;}}//判断是否有结果if(nums[left] != target){return {-1,-1};}else{begin=left;}//找右端点left=0,right=nums.size()-1;while(left < right){int mid=left+(right-left+1)/2;//自己分析;if(nums[mid] <= target){left=mid;}else{right=mid-1;}}return {begin,right};}
};

4.前缀和;

1.首先找规律,创建dp前缀和数组使用前缀和数组,完成要求。

#include <iostream>
using namespace std;
#include<vector>int main() 
{// 1.读入数据int n,q;cin>>n>>q;vector<int> arr(n+1);for(int i=1;i<=n;i++) cin>>arr[i];//预处理出来前缀和数组;vector<long long> dp(n+1);for(int i=1;i<=n;i++) dp[i]=dp[i-1]+arr[i];//使用前缀和数组;int l = 0,r=0;while(q--){cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE5】动画混合空间的基本用法

项目资源文末百度网盘自取 什么是动画混合空间 混合空间分为两种: 通过一个数值控制通过两个数值控制 下面通过演示让大家更直观地了解 在Character文件夹中单击右键,选择动画(Animation),选择旧有的混合空间1D 然后选择骨骼&#xff08;动画是基于骨骼显示的,所以需要选择…

vue防止用户连续点击造成多次提交

中心思想&#xff1a;在第一次提交的结果返回前&#xff0c;将提交按钮禁用。 方法一&#xff1a;给提交按钮加上disabled属性&#xff0c;在请求时先把disabled属性改成true&#xff0c;在结果返回时改成false 方法二&#xff1a;添加loading遮罩层&#xff0c;可以直接使用e…

北京保险服务中心携手镜舟科技,助推新能源车险市场规范化

2022 年&#xff0c;一辆新能源汽车在泥泞的小路上不慎拖底&#xff0c;动力电池底壳受损&#xff0c;电池电量低。车主向保险公司报案&#xff0c;希望能够得到赔偿。然而&#xff0c;在定损过程中&#xff0c;保司发现这辆车的电池故障并非由拖底事件引起&#xff0c;而是由于…

EDM营销平台的核心功能?如何做精准营销?

EDM营销平台如何选择&#xff1f;怎么使用邮件营销平台优化发信&#xff1f; EDM营销平台以其独特的优势&#xff0c;成为了企业实现精准营销、提升品牌影响力的重要工具。那么&#xff0c;EDM营销平台究竟拥有哪些核心功能呢&#xff1f;接下来&#xff0c;AokSend就来一一探…

PyQt5---初识PyQt5相关及开发实战介绍

什么是GUI GUI是Graphical User Interface&#xff08;图形用户界面&#xff09;的缩写&#xff0c;是一种用户与计算机交互的方式&#xff0c;通过使用图形化的元素&#xff08;如按钮、窗口、菜单等&#xff09;来帮助用户完成任务。GUI使得用户可以通过鼠标、键盘等输入设备…

【C语言】整数存储、大小端概念

文章目录 整数存储大小端 整数存储 在计算机中&#xff0c;整数都是通过二进制保存的&#xff0c;不论是十六进制还是八进制还是十进制 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码 对于整形来说&#xff1a;数据存放内存中其实存放的是补码 在计算机系统中&…

LinuxU盘挂载原理,为什么要用到U盘挂载及实现U盘挂载

目录 一、U盘挂载原理 二、为什么要用到U盘挂载 三、实现U盘挂载 一、准备工作 1、安装gcc 2、下载ntfs-3g 3、解压 4、编译准备 5、编译并安装 二、挂载演示 一、U盘挂载原理 Linux的U盘挂载原理涉及以下几个方面&#xff1a; 设备识别&#xff1a;当您将U盘插入Lin…

DVWA 靶场搭建

文章目录 环境说明1 DVWA 简介2 DVWA 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 DVWA 简介 DVWA&#xff08;Damn Vulnerable Web App&#xff09;是一个基于 “PHP MySQL” 搭建的Web应用程序&…

Linux多进程中wait()函数学习

wait()函数是Linux/Unix系统里的一个系统级函数&#xff0c;在C语言中通过#include <sys/wait.h>包含该系统调用的头文件。 想要查看如何使用这个函数&#xff0c;可以在终端中输入&#xff1a; man 2 wait如下图&#xff1a; wait系统调用可以让父线程阻塞等待子线程的…

DM数据库安装及使用(Windows、Linux、docker)

Windows 先解压安装包 点击setup安装 下一步 勾选接受然后下一步 下一步 选择典型安装下一步 下一步 搜索DM数据库配置助手然后一直下一步 然后搜索DM管理工具 登录 登录成功 widows版本安装成功 Linux安装 操作系统CPU数据库CentOS7x86_64 架构dm8_20230418_x86_rh6_64 …

liunx安装达梦教程

1.首先用户在安装 DM 之前需要检查或修改操作系统的配置&#xff0c;以保证 DM 正确安装和运行。 标题及下文中提到的 Linux(Unix)&#xff0c;包括 Linux、AIX、HP-UNIX、Solaris 和 FreeBSD 操作系统。以下安装程序说明将以 Red Hat Enterprise Linux 6 for x86-64 系统为…

CSS案例-1.字体样式练习

效果 知识点 字体大小font-size 相对长度单位 说明 em 相对于当前对象内文本的字体尺寸 px 像素,最常用,推荐使用 绝对长度单位 说明 in 英寸 cm 厘米 mm 毫米 pt 点 Unicode字体 字体名称 英文名称 Unicode编码 宋体 SimSun \5B8B\4F53 新宋体 NSimSun \65B0\5B8B\4F53

mac电脑解决无法打开软件

文章目录 报错内容解决方法一方法二方法三 报错内容 macOS无法验证此App是否包含恶意软件。 解决方法一 打开系统偏好设置>安全性与隐私>通用&#xff0c;这个时候有个按钮&#xff0c;“仍然允许”点击即可。 方法二 按住Control键点按应用, 然后打开&#xff0c…

网络编程:TCP和UDP

一、通信模式 1.1 套接字socket 1.网络通信通过套接字进行数据传输 2.socket是一个函数&#xff0c;为通信创建一个端点&#xff0c;并返回该端点的文件描述符 3.套接字本身是一个文件描述符&#xff0c;对应的是一个特殊的文件&#xff0c;该文件描述符维护了两个缓冲区&a…

MySQL一些命令记录

查看数据引擎 show engines;创建数据库,并选择库 CREATE DATABASE IF NOT EXISTS test_database; USE test_database;创建表 CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY,field1 VARCHAR(50),field2 VARCHAR(50),field3 VARCHAR(50),field4 …

PHP中的反序列化漏洞

PHP中的反序列化漏洞 目录 PHP 中的序列化与反序列化 概述 序列化 基本类型的序列化 对象的序列化 反序列化 示例序列化与反序列化 反序列化漏洞 - PHP 中的魔术方法 - Typecho_v1.0 中的反序列化漏洞 POP链的构造思路 pop链案例 反序列化逃逸 字符串逃逸&#xff…

Linux安装使用one-api 格式访问所有的大模型

One API ✨ 通过标准的 OpenAI API 格式访问所有的大模型&#xff0c;开箱即用 ✨ [!NOTE] 本项目为开源项目&#xff0c;使用者必须在遵循 OpenAI 的使用条款以及法律法规的情况下使用&#xff0c;不得用于非法用途。 根据《生成式人工智能服务管理暂行办法》的要求&#xff…

Android 音频系统

导入 早期Linux版本采用的是OSS框架&#xff0c;它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架&#xff0c;是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后&#xff0c;OSS就逐步…

代码随想录day20(2)二叉树:完全二叉树节点个数(leetcode222)

题目要求&#xff1a;求一个完全二叉树的节点个数 思路&#xff1a;首先完全二叉树可以用普通二叉树的方法来求&#xff0c;但是需要遍历所有的节点。 但是对于完全二叉树来说&#xff0c;只有最底层右侧的节点可能没满&#xff0c;其余每层节点都达到了最大值。所以我们可以…

智慧城管:街面秩序沿街商铺视频可视化AI智能监管方案

一、背景分析 随着城市化的加速和商业活动的日益繁荣&#xff0c;沿街商铺的管理面临着越来越多的挑战。沿街商户的乱堆乱放、占道经营、违章停车等违法行为&#xff0c;一直以来都是城市管理中的难题。这不仅存在交通安全隐患&#xff0c;也造成了市容秩序混乱&#xff0c;严…