【刷题(17)】技巧

一 技巧基础

二 136. 只出现一次的数字

1 题目

在这里插入图片描述

2 解题思路

哈希表map

其实看到题目数组中某个元素出现的次数也可以直接用unordered_map容器统计每一个元素出现的次数,然后在遍历整个map容器查看是否有元素出现的次数等于1

3 code

class Solution {
public:int singleNumber(vector<int>& nums) {//第一次遍历,使用哈希来统计数组中元素出现次数unordered_map<int,int> map;for(int num:nums){map[num]++;}//第二次遍历,查看是否有元素出现的次数等于1for(int num:nums){if(map[num]==1) return num;}return 0;}
};

三 169. 多数元素

1 题目

在这里插入图片描述

2 解题思路

本题常见的三种解法:

  • 哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N)O(N)O(N) 。
  • 数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。
  • 摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N)O(N) 和 O(1)O(1)O(1) ,为本题的最佳解法。

哈希表+打擂台(边哈希,边打擂台,省去二次遍历哈希表在麻烦)

我们使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。

3 code

class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int,int>map;//哈希int majority=0,cnt=0;//打擂台//哈希for(int num:nums){map[num]++;//打擂台if(map[num]>cnt){majority=num;cnt=map[num];}}return majority;}
};

四 75. 颜色分类

1 题目

在这里插入图片描述

2 解题思路

首先,所有数都≤2,那么索性把所有数组置为2,然后遇到所有≤1的,就再全部置为1,,覆盖了错误的2,这时候所有2的位置已经正确,最后所有≤0的全部置为0,也就覆盖了一些错误的1,这时候,0和1的位置都正确。最重要的就是需要两个指针指向下一个1或0的位置

3 code

class Solution {
public:void sortColors(vector<int>& nums) {int n0=0,n1=0;for(int i=0;i<nums.size();i++){int num=nums[i];//先将所有在数置为2nums[i]=2;//如果数值小于等于1,将数置为1//(为0的时候,会将1的计数位前推一位)if(num<=1){nums[n1]=1;n1++;}//如果数值小于等于0,将数置为0if(num<=0){nums[n0]=0;n0++;}}}
};

五 31. 下一个排列

1 题目

在这里插入图片描述

2 解题思路

这道题是根据 维基百科 ,下图所示:
在这里插入图片描述
翻译过来:

先找出最大的索引 k 满足 nums[k] < nums[k+1],如果不存在,就翻转整个数组;
再找出另一个最大索引 l 满足 nums[l] > nums[k];
交换 nums[l] 和 nums[k];
最后翻转 nums[k+1:]。
举个例子:

比如 nums = [1,2,7,4,3,1],下一个排列是什么?

我们找到第一个最大索引是 nums[1] = 2

再找到第二个最大索引是 nums[4] = 3

交换,nums = [1,3,7,4,2,1];

翻转,nums = [1,3,1,2,4,7]

完毕!

所以,

时间复杂度:O(n)O(n)O(n)

空间复杂度:O(1)O(1)O(1)

在这里插入图片描述

3 code

class Solution {
public:void nextPermutation(vector<int>& nums) {int cur=nums.size()-2;//前面大于后面在while(cur>=0&&nums[cur]>=nums[cur+1]){cur--;}//已经是最大数组了if(cur<0){sort(nums.begin(),nums.end());}else{//表示找到国降序在一个位置int pos=nums.size()-1;while(nums[pos]<=nums[cur]){pos--;}swap(nums[cur],nums[pos]);reverse(nums.begin()+cur+1,nums.end());}}
};

六 31. 下一个排列

1 题目、

在这里插入图片描述

2 解题思路

题目要求查找重复的整数,很容易想到使用「哈希表」,但是题目中要求「只用常量级 O(1 的额外空间」,该方法不符合题意
还可以考虑使用「力扣」第 41 题:缺失的第一个正数 的技巧,使用「原地哈希」,但是题目要求「你设计的解决方案必须不修改数组 nums」,该方法不符合题意
但是题目中还说:「数字都在 1 到 n 之间(包括 1 和 n)」,查找一个有范围的整数,可以使用「二分查找」(这一点很重要,很多「二分查找」的问题就是要我们找一个整数);
「快慢指针」的做法很有技巧,具体做法请见其它题解。

可以使用「二分查找」的原因

因为题目要找的是一个 整数,并且这个整数有明确的范围,所以可以使用「二分查找」。

重点理解:

这个问题使用「二分查找」是在数组 [1, 2,…, n] 中查找一个整数,而 并非在输入数组数组中查找一个整数。

使用「二分查找」查找一个整数,这是「二分查找」的典型应用,经常被称为「二分答案」。在 题解 中,「题型二」与「题型三」都是这样的问题。

央视《幸运 52》节目的「猜价格游戏」,就是「二分答案」。玩家猜一个数字,如果猜中,游戏结束,如果主持人说「猜高了」,应该猜一个更低的价格,如果主持人说「猜低了」,应该猜一个更高的价格。

继续 解题思路:每一次猜一个数,然后 遍历整个输入数组,进而缩小搜索区间,最后确定重复的是哪个数。

理解题意:

n + 1 个整数,放在长度为 n 的数组里,根据「抽屉原理」,至少会有 1 个整数是重复的;
抽屉原理:把 10 个苹果放进 9 个抽屉,至少有一个抽屉里至少放 2 个苹果。

方法:二分查找

「二分查找」的思路是先猜一个数(搜索范围 [left…right] 里位于中间的数 mid),然后统计原始数组中 小于等于 mid 的元素的个数 count:

如果 count 严格大于 mid。根据 抽屉原理,重复元素就在区间 [left…mid] 里;
否则,重复元素可以在区间 [mid + 1…right] 里找到,其实只要第 1 点是对的,这里肯定是对的,但要说明这一点,需要一些推导,我们放在最后说。

方法:快慢指针

数组形式的链表

题目设定的问题是 N+1 个元素都在 [1,n] 这个范围内。这样我们可以用那个类似于 ‘缺失的第一个正数’ 这种解法来做,但是题意限制了我们不能修改原数组,我们只能另寻他法。也就是本编题解讲的方法,将这个题目给的特殊的数组当作一个链表来看,数组的下标就是指向元素的指针,把数组的元素也看作指针。如 0 是指针,指向 nums[0],而 nums[0] 也是指针,指向 nums[nums[0]].
这样我们就可以有这样的操作

C++
int point = 0;
while(true){point = nums[point]; // 等同于 next = next->next; 
}

链表中的环

假设有这样一个样例:[1,2,3,4,5,6,7,8,9,5]。如果我们按照上面的循环下去就会得到这样一个路径:1 2 3 4 5 [6 7 8 9] [6 7 8 9] [6 7 8 9] . . .这样就有了一个环,也就是 6 7 8 9。point 会一直在环中循环的前进。
这时我们设置两个一快(fast)一慢(slow)两个指针,一个每次走两步,一个每次走一步,这样让他们一直走下去,直到他们在重复的序列中相遇,
在这里插入图片描述

3 code

二分查找

class Solution {
public:int findDuplicate(vector<int>& nums) {int len=nums.size();int left=1;int right=len-1;while(left<right){int mid=(left+right)/2;//nums中小于等于mid的元素的个数int count=0;for(int num:nums){if(num<=mid){count++;}}if(count>mid){//下一轮搜索的区间[left..mid]right=mid;}else{//下一轮搜索的区间[mid+1..right]left=mid+1;}}//退出循环以后 left 与 right 重合,left (或者 right)就是我们要找的重复的整数;return left;}
};

快慢指针

class Solution {
public:int findDuplicate(vector<int>& nums) {int n = nums.size();int slow = 0;int fast = 0;//快慢指针相遇while (true) {slow = nums[slow];fast = nums[nums[fast]];if (slow == fast) break;}//快指针返回终点,继续出发fast = 0;while (nums[slow] != nums[fast]) {slow = nums[slow];fast = nums[fast];}return nums[slow];}
};

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

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

相关文章

商城项目【尚品汇】07分布式锁-2 Redisson篇

1 Redisson功能介绍 基于自定义setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都是使用…

将HTML页面中的table表格元素转换为矩形,计算出每个单元格的宽高以及左上角坐标点,输出为json数据

export function huoQuTableElement() {const tableData []; // 存储表格数据的数组let res [];// 获取到包含表格的foreignObject元素const foreignObject document.getElementById(mydctable);if (!foreignObject){return ;}// 获取到表格元素let oldTable foreignObject…

Nativefier : 将网址打包成exe桌面程序

1、需求场景 在日常开发中&#xff0c;需要针对一些网页在一体机上使用&#xff0c;同时在浏览器上也可以使用&#xff0c;这里推荐大家用nativefier&#xff0c;对网址进行打包。以下是nativefier安装命令&#xff1a; npm install nativefier -g 2、使用方法 --arch 系统 …

《混凝土坝监测仪器系列型谱》修订中监测仪器分类方案解读

随着科技的不断进步和监测需求的日益增加&#xff0c;对监测仪器分类方案进行修订已成为必然的趋势。本文旨在探讨《混凝土坝监测仪器系列型谱》中对现有仪器分类方式的修订&#xff0c;以及监测仪器选用的相关内容。希望对大家中有所帮助&#xff1a; 一、取消过时条目&#x…

java中方法引用

目录 方法引用&#xff1a; 引用静态方法 引用成员方法 引用构造方法 使用类名引用成员方法 引用数组的构造方法 练习 方法引用&#xff1a; 把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 在Java中&#xff0c;方法引用是一种简化Lambda表达式的…

教务管理系统-学员办理体系介绍

随着时代的快速开展&#xff0c;教育方面也没落下&#xff0c;不仅是线下线上都呈现许多训练校园&#xff0c;办理软件也顺势而为的呈现广阔训练校园面前&#xff0c;许多的校园和训练组织也都在运用教务管理系统了。运用教务管理系统里边的学员办理体系可以让相应的办理人员更…

Redis的一致性

一、产生的原因 使用缓存&#xff0c;在进行写操作的时候就会出现不一致的问题。 一致性分为三类&#xff1a;强一致性&#xff0c;弱一致性&#xff0c;最终一致性 二、方案 2.1 延时双删 在更新数据库的操作前后分别进行一次删除缓存的操作&#xff0c;并在更新数据库之后…

《HelloGitHub》第 98 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

容器化部署fastdfs文件存储

目录 一、软件信息 二、构建fastdfs镜像 三、docker 启动fdfs服务 四、k8s部署fdfs服务 1、fdfs部署文件 五、外部服务访问 一、软件信息 fastdfs版本&#xff1a;fastdfs:V5.11 libfastcommon版本: V1.0.36 fastdfs-nginx-module版本&#xff1a;V1.20 nginx版本&…

使用Spring Boot和MybatisPlus的Java CRM客户关系管理系统源码

项目名称&#xff1a;CRM客户关系管理系统 功能模块及描述&#xff1a; 一、待办事项 今日需联系客户&#xff1a;显示当日需跟进的客户列表&#xff0c;支持查询和筛选。 分配给我的线索&#xff1a;管理分配给用户的线索&#xff0c;包括线索列表和查询功能。 分配给我的客…

导弹研究中常用坐标系及坐标系之间的变换

在导弹飞行控制过程中&#xff0c;需要时刻掌握导弹的飞行状态 &#xff08;速度、位置、姿态角等&#xff09;&#xff0c;这就有赖于描述导弹飞行状态的坐标系。除了大地坐标系和地心大地直角坐标系外&#xff0c;导弹常用的坐标系还有很多&#xff0c;合理而恰当地选择参考系…

37【透视】两点透视

1 两点透视比较合适表现物体的结构 用两点透视绘制比较小的、箱子之类的物体 2 一点透视和两点透视的共存关系

vs - vs2013/vs2019工程文件的区别

文章目录 vs - vs2013/vs2019工程文件的区别概述笔记sln文件的区别VisualStudioVersion vcxproj文件的区别ToolsVersionPlatformToolset 备注更方便的方法END vs - vs2013/vs2019工程文件的区别 概述 为了避免安装UCRT的问题&#xff0c;想将手头的vs2019工程降级为vs2013工程…

解决Mac ~/.bash_profile 配置的环境变量重启终端后失效问题

在Mac系统中&#xff0c;配置环境变量通常是在~/.bash_profile文件中进行。然而&#xff0c;有时会遇到配置的环境变量在重启终端后失效的问题。 解决办法&#xff1a; 在~/.zshrc文件最后或最前面&#xff0c;增加一行 source ~/.bash_profile

SARscape雷达图像处理软件简介

合成孔径雷达&#xff08;SAR&#xff09;拥有独特的技术魅力和优势&#xff0c;渐成为国际上的研究热点之一&#xff0c;其应用领域越来越广泛。SAR数据可以全天候对研究区域进行量测、分析以及获取目标信息。高级雷达图像处理工具SARscape&#xff0c;能让您轻松将原始SAR数据…

Leetcode 第 131 场双周赛题解

Leetcode 第 131 场双周赛题解 Leetcode 第 131 场双周赛题解题目1&#xff1a;3158. 求出出现两次数字的 XOR 值思路代码复杂度分析 题目2&#xff1a;3159. 查询数组中元素的出现位置思路代码复杂度分析 题目3&#xff1a;3160. 所有球里面不同颜色的数目思路代码复杂度分析 …

AI 时代,产品经理该如何进化

前言 传统的互联网业务或者游戏业务&#xff0c;产品或者业务输出需求&#xff0c;技术人员只需要指哪打哪就好了。而人工智能发展到当下这个尴尬的阶段&#xff0c;仿佛它能干很多事&#xff0c;但是真把它往业务里搁就发现&#xff0c;这个叛逆的小东西不一定胜任的了这些有…

AI大模型学习笔记之四:生成式人工智能是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已经广为人知&#xff0c;我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话&#xff0c;并且能够记忆上下文情境。 GPT-4多模态分析对话 Midj…

数字机顶盒、显示器方案DCDC芯片OC5816 2A,18V同步降压DC-DC

概述 OC5816 是一款 2A 的高集成度、高效率同步整流降压转换器。在一个相当宽的输出电流负载范围内&#xff0c;OC5816 可以高效工作。 OC5816 的两种工作模式&#xff0c;固定频率PWM 峰值电流控制和轻载 PFM 开关模式&#xff0c;允许系统高效工作在一个相当宽的输出电流…

i 人 聊 天 手 册(e人禁止入内)

在之前的读书笔记-《蔡康永的说话之道》中&#xff0c;作者给大家分享了很多具体的要点&#xff0c;其更偏向于战术层面&#xff0c;我更想要的是一个类似聊天手册的东西&#xff0c;就让我自己来总结下吧。 虽然在 MBTI 中&#xff0c;按照获取能量的方式定义了 i 人、e 人&a…