面试经典 150 题 -- 数组 / 字符串 (总结)

总的链接

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

88.合并两个有效数组

因为有序,直接设置双指针置于两个数组的末尾,从后往前直接模拟就好了,贪心的比较两个指针所指元素,优先挑出大的,放入答案数组中去;

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 = m - 1, p2 = n - 1;int tail = m + n - 1;int cur;while (p1 >= 0 || p2 >= 0) {if (p1 == -1) {cur = nums2[p2--];} else if (p2 == -1) {cur = nums1[p1--];} else if (nums1[p1] > nums2[p2]) {cur = nums1[p1--];} else {cur = nums2[p2--];}nums1[tail--] = cur;}}
};

27.移除元素

题意 : 在nums中原地移除值=val的数,然后返回新数组的长度;

思路 : 模拟即可,设置双指针,一个j指向新数组的尾下标,一个i指向原数组,一遍遍历,当nums[i]!=val时,将其加入新数组中,否则直接跳过即可;

class Solution {
public:int removeElement(vector<int>& nums, int val) {int n = nums.size() ;int i=0,j=0;for(;i<n;i++){if(nums[i]!=val) nums[j++] = nums[i];}return j ;}
};

26.删除有序数组中的重复项

思路 : 还是双指针模拟,思路与上题类似; 

class Solution {
public:int removeDuplicates(vector<int>& nums) {int j=0;int n = nums.size() ;for(int i=0;i<n;i++){int k = i + 1 ;while(k<n && nums[k]==nums[i]) k ++;nums[j++] = nums[i];i = k - 1 ; }return j ;}
};

80 . 删除有序数组中的重复项 II

思路 : 上一题多了一个保留两个重复元素,那么在枚举的过程中,发现重复的元素数量>=2,那么只将两个加入新数组即可;

class Solution {
public:int removeDuplicates(vector<int>& nums) {int j=0;int n = nums.size() ;for(int i=0;i<n;i++){int k = i + 1 ;while(k<n && nums[k]==nums[i]) k ++;if(k-i>=2){nums[j++] = nums[i];nums[j++] = nums[i];}else{nums[j++] = nums[i];}i = k - 1 ; }return j ;}
};

169.多数元素

法一(众数理论) : 

思路 : 众数理论,由于在题目当中的众数定义为出现次数>=n/2的元素,那么在排好序之后,该元素其中的一个一定会出现在数组最中间 ;

class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(),nums.end());return nums[nums.size()/2];}
};

法二 (哈希表暴力枚举): 

思路 : 利用hash表统计每个元素出现次数,然后枚举哈希表,找到次数最大的元素;这里优化为边遍历边统计;

class Solution {
public:int majorityElement(vector<int>& nums) {int n = nums.size();unordered_map<int,int> counts;int cnt = 0;int ma;for(int num : nums){++counts[num];if(counts[num] > cnt){ma = num;cnt = counts[num];}}return ma;}
};

法三(摩尔投票法)

利用摩尔投票法,来解决此题,详情请看代码 : 

class Solution {public int majorityElement(int[] nums) {int x = 0 , votes = 0 ;for(int num : nums){if(votes == 0) x = num  ;votes += num == x ? 1 : -1 ;}return x ;}
}

189.轮转数组

思路 : 首先先复制nums数组到res中,保留元素组的情况,对于右移k位,那么也就是nums[(i+k)%n] = res[i] ,详细请看代码 : 

class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();vector<int> res(n);for(int i=0;i<n;i++)  res[i] = nums[i];for(int i=0;i<n;i++){nums[(k+i)%n] = res[i];}}
};

121 . 买卖股票的最佳时机 

思路 : 一遍遍历,在遍历的过程中,用pre存前面的最小元素,那么对于第i天如果要卖股票的话,那么最大收益就是prices[i]-pre ; 一遍遍历,循环更新答案就好 ;

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size() ;int mi = prices[0] ;int ans = 0 ;for(int i=1;i<n;i++){ans = max (ans , prices[i] - mi);mi = min(mi , prices[i]);}return ans ;}
};

122 . 买卖股票的最佳时机 II

这题就直接遍历就好了,举个例子 :

3 1 5 , 那么ans = 5 - 1

1 2 4 , 那么ans = 4 - 1 = 4-2+2-1

用贪心的思路,相邻两个, 只要p[i]>p[i-1],那么就在前一天买,第i买,就会造成最优的结果 ;

class Solution {
public:int maxProfit(vector<int>& prices) {int ans = 0;for(int i=1;i<prices.size();i++){int tmp = prices[i] - prices[i-1];ans += tmp>0 ? tmp : 0;}return ans;}
};

55.跳跃游戏

一遍遍历 ,记录当前能够达到的最远距离k,如果 i > k 表示到不了,直接返回false即可,在循环的过程中更新k即可;

class Solution {
public:bool canJump(vector<int>& nums) {int k = 0;for(int i=0;i<nums.size();i++){if(i>k) return false;k = max(k,i+nums[i]);}return true;}
};

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

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

相关文章

【区块链】区块链技术:起源、发展、重点技术、应用场景与未来演进

区块链技术&#xff1a;起源、发展、重点技术、应用场景与未来演进 引言一、技术起源与发展历史1. 技术起源2. 技术发展历史1. 初期阶段&#xff08;2009-2013年&#xff09;2. 探索阶段&#xff08;2014-2016年&#xff09;3. 发展阶段&#xff08;2017年至今&#xff09; 二、…

前端使用阿里Oss

前言&#xff1a;有时候为了减少宽带和服务器压力等等&#xff0c;就直接给前端操作oss实习文件上传了官方文档 安装 npm i ali-oss 因为我们是js可以使用node jdkconst OSS require(ali-oss);// 初始化OSS客户端。请将以下参数替换为您自己的配置信息。 const client new O…

Rust循环和函数

下面聊聊以下主题&#xff1a; 基于条件的分支循环函数属性测试 基于条件的分支 基于条件的分支&#xff0c;可以通过常见的 if、if else 或 if else if else 构造来完成&#xff0c;例如下面的示例&#xff1a; fn main() { let dead false; let health 48; if dead { p…

《汇编语言:基于linux环境》补码研究

刚开始我使用&#xff0c;如下命令编译&#xff0c;链接程序。 nasm -f elf64 -g -F stabs sandbox.asmld -o sandbox sandbox.ogdb sandbox当我运行 sandbox 时&#xff0c;它会正常运行&#xff0c;但 gdb 无法显示任何源代码。为什么&#xff1f;当我在 gdb 中尝试 run 时&a…

鸿蒙(ArkUI)开发:实现二级联动

场景介绍 列表的二级联动&#xff08;Cascading List&#xff09;是指根据一个列表&#xff08;一级列表&#xff09;的选择结果&#xff0c;来更新另一个列表&#xff08;二级列表&#xff09;的选项。这种联动可以使用户根据实际需求&#xff0c;快速定位到想要的选项&#…

粒子群优化算法(Particle Swarm Optimization,PSO)求解基于移动边缘计算的任务卸载与资源调度优化(提供MATLAB代码)

一、优化模型介绍 移动边缘计算的任务卸载与资源调度优化原理是通过利用配备计算资源的移动无人机来为本地资源有限的移动用户提供计算卸载机会&#xff0c;以减轻用户设备的计算负担并提高计算性能。具体原理如下&#xff1a; 任务卸载&#xff1a;移动边缘计算系统将用户的计…

Windows11搭建GPU版本PyTorch环境详细过程

Anaconda安装 https://www.anaconda.com/ Anaconda: 中文大蟒蛇&#xff0c;是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。从官网下载Setup&#xff1a;点击安装&#xff0c;之后勾选上可以方便在普通命令行cmd和PowerShell中使用…

BGP同步规则

BGP同步规则&#xff1a;开启同步下&#xff0c;从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传)&#xff0c;除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞&#xff0c;向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响…

qt学习:http+访问百度智能云api实现车牌识别

目录 登录到百度智能云&#xff0c;找到文字识别 完成操作指引 开通 查看车牌识别的api文档 ​编辑​编辑 查看自己应用的api key 查看回应的数据格式 编程步骤 ui界面编辑 添加模块&#xff0c;头文件和定义变量 新建两个类&#xff0c;一个图像Image类&#xff0c…

Linux常用指令的整合

之前面试被问到了Linux相关的指令&#xff0c;所以我整理的一份常用的Linux指令列表&#xff0c;适用于大多数Linux发行版&#xff0c;现分享给大家&#xff1a; 文件操作 ls&#xff1a;列出目录内容。cd [目录]&#xff1a;更改当前目录。pwd&#xff1a;显示当前目录路径。m…

Day01-变量和数据类型课后练习(输出你最想说的一句话,定义所有基本数据类型的变量和字符串变量,用合适类型的变量存储个人信息并输出,定义圆周率PI,简答题)

参考答案博客链接跳转 文章目录 1、输出你最想说的一句话&#xff01;2、定义所有基本数据类型的变量和字符串变量3、用合适类型的变量存储个人信息并输出4、定义圆周率PI5、简答题 1、输出你最想说的一句话&#xff01; 编写步骤&#xff1a;List item定义类 Homework1&…

Qt容器QVariant

在Qt中&#xff0c;QVariant是一个通用的值容器&#xff0c;它可以存储任意类型的数据&#xff0c;例如整数、字符串、列表等等。其主要用于提供一种通用的数据类型&#xff0c;方便在不同的函数、类、模块之间传递数据。 QVariant类是Qt的共用体union数据类型&#xff0c;不仅…

【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig 1 概述2 nanopi_neo2_defconfig3 编译过程分析3.1 编译目标3.2 scripts_basic3.2.1 prefix src定义3.2.2 PHONY3.2.3 __build3.2.4 fixdep3.3 objscripts/kconfig 1 概述 上一章中&#xff0c;对Makefile相关源码进行了初步分析&…

从零开始:CentOS系统下搭建DNS服务器的详细教程

前言 如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目&#xff0c;是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目&#xff0c;基于archetype可以创建多种类型的java项目&#xff1b;Maven仓库…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

HarmonyOS --@Prop和@Link同步信息装饰器

当应用中父子组件需要数据同步时&#xff0c;可以使用Prop和Link装饰器 一个组件被引用时&#xff0c;引用其他组件的组件就是父组件、被引用的组件就是子组件。 由于State装饰器无法执行父子之间的数据通信 Prop&#xff1a;单向同步、父组件中修改数据&#xff0c;会同步到子…

最近公共祖先(LCA)主要算法:

1&#xff09;向上标记法&#xff1a; 从x向上走到根节点&#xff0c;并标记所有经过的节点。 从y向上走到根节点&#xff0c;当第一次遇到已标记的节点时&#xff0c;就找到了LCA&#xff08;x,y&#xff09;. 2&#xff09;树上倍增法&#xff1a; 树上倍增法是一个很重要…

心理学笔记——我们如何思考-思想、语言和手语

我们如何思考-思想、语言和手语 研究语言的理论&#xff1a;计算理论、认知神经学、进化论 当我们讨论语言时&#xff0c;指的是英语、中文、日语这样的语言系统 所有语言都共享一些深层且复杂的共性&#xff0c;最直观的就是每一种语言都能够有效地表达抽象概念——思想、物…

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …