【Leetcode】top 100 技巧

136 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

技巧:异或    相同为0,剩到最后的数值只出现一次;

class Solution(object):def singleNumber(self, nums):""":type nums: List[int]:rtype: int"""out = 0for i in range(len(nums)):out = out ^ nums[i]return out
169 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

方法一:计数器                                 空间复杂度O(n)

方法二:排序后返回nums[n//2]         时间复杂度O(nlogn)    系统自带排序空间复杂度O(logn)

方法三:Boyer-Moore 投票算法

相似思路:如果一个数组有大于一半的数相同,那么任意删去两个不同的数字,新数组还是会有相同的性质,当删去后的数组仅为同一个值,该值为众数;

class Solution(object):def majorityElement(self, nums):""":type nums: List[int]:rtype: int"""val, cnt = 0, 0for num in nums:if not cnt: val = num    # val为0代表前面的都消掉了,重新赋个可能的众数if num == val: cnt+=1else: cnt-=1return val
75 颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库内置的 sort 函数的情况下解决这个问题。

方法一:双指针     参考题283的移动零(将所有零移到数组末尾同时保持非零元素的相对位置)

这里需要把2移到数组末尾(正序遍历),把0移到数组开头(倒序遍历)

class Solution(object):def sortColors(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""left, right, n = 0, 0, len(nums)    # 从左往右将2移到最后while right<n:if nums[left] != 2:                  #left找2,right找非2left, right = left+1, right+1else:while right<n:if nums[right] != 2:nums[left], nums[right] = nums[right], nums[left]breakright += 1left, right = n-1, n-1             # 从右往左将0移到最先while left>=0:          if nums[right] != 0:           # right找0,left找非0  left, right = left-1, right-1else:while left>=0:if nums[left] !=0:nums[left], nums[right] = nums[right], nums[left]breakleft -= 1return nums

方法二:双指针   维护0和1的终点坐标  即 [:p0]是0    [p0:p1]是1    [p1:]是2

找到1时将其交换到nums[p1]再将p1+1,找到0时将其交换到nums[p0]再将p0+1,p1+1,但nums[p0]可能是1(当p0<p1时),此时还要把可能的1交换到nums[p1]

同思路,维护p0和p2    

class Solution(object):def sortColors(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""p0, p1, n = 0, 0, len(nums)for i in range(n):if nums[i] == 1:nums[p1], nums[i] = nums[i], nums[p1]p1 += 1elif nums[i] == 0:nums[p0], nums[i] = nums[i], nums[p0]if p0<p1:nums[p1], nums[i] = nums[i], nums[p1]p0, p1 = p0+1, p1+1return nums
31 下一个排列

字典序:以[1,2,3]为例:[1,2,3] [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1],给你一个整数数组 nums ,找出 nums 的下一个排列。必须原地修改,只允许使用额外常数空间。数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

step1:找到最大索引k满足nums[k]<nums[k+1]——倒序遍历找小于后一个元素的第一个元素

             如果不存在就翻转整个数组(此时为最大排列)

step2:找到最大索引l满足nums[l]>nums[k]——第一遍倒序遍历证明k之后都是降序,同样倒序遍历找到第一个大于nums[k]的元素即为nums[l]

step3:交换nums[l]和nums[k]

step4:翻转nums[k+1:]

class Solution(object):def nextPermutation(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""def reverse(nums, start, end):while start < end:nums[start], nums[end] = nums[end], nums[start]start, end = start+1, end-1return numsn = len(nums)if n == 1: return  numsfor k in range(n-2, -1, -1):   if nums[k]<nums[k+1]: break# k为0的时候可能是定位到0或者结束遍历if k or nums[0]<nums[1]: for l in range(n-1, k, -1):if nums[l]>nums[k]: breaknums[k], nums[l] = nums[l], nums[k]nums = reverse(nums, k+1, n-1)else:nums = reverse(nums, 0, n-1)return nums
287 寻找重复数

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

因为数字范围在[1,n]之间,即以数字作为下标索引不会出现越界问题;通过这种链接关系构建链表;

以[1,2,3,2]为例:nums[0] = 1  -->  nums[1] = 2  -->  nums[2] = 3  -->  nums[3] = 2 --> nums[2] = 3  (1 -->  2 -->  3 -->  2 -->  3 -->  2 -->  ...)出现了环状结构

寻找环入口:快慢指针     可参考题142

class Solution(object):def findDuplicate(self, nums):""":type nums: List[int]:rtype: int"""if len(nums) == 1: return nums[0]fast, slow = nums[nums[0]], nums[0]while fast != slow: fast = nums[nums[fast]]slow = nums[slow]idx1, idx2 = 0, fastwhile idx1 != idx2:idx1 = nums[idx1]idx2 = nums[idx2]return idx1

环状问题补充:

1.判断有无环:快慢指针看是否相遇;

2.判断环入口:从快慢指针相遇点和头结点同步同速度出发,相遇的点即为环入口;

3.计算环长度:快慢指针相遇后只移动慢指针,再次相遇时慢指针移动的次数即为环的长度; 

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

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

相关文章

LeetCode 96. 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1提…

代码随想录算法训练营第二十二天| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

系列文章目录 目录 系列文章目录235. 二叉搜索树的最近公共祖先①递归法自己写的简洁版 ②迭代法不能这样写&#xff01;正确写法 701.二叉搜索树中的插入操作①递归法②迭代法 450.删除二叉搜索树中的节点递归法 235. 二叉搜索树的最近公共祖先 ①递归法 自己写的 class So…

书生·浦语大模型InternLM-Chat-1.8B 智能对话 Demo 第二期

文章目录 InternLM-Chat-1.8B 智能对话 Demo环境准备下载模型运行 InternLM-Chat-1.8B web 运行八戒 demo下载模型执行Demo InternLM-Chat-1.8B 智能对话 Demo 环境准备 在InternStudio平台中选择 10% A100(1/4) 的配置&#xff08;平台资源有限&#xff09;&#xff0c;如下图…

【c语言】自定义类型:联合体(公用体)【详解】

联合体 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫&#xff1a;共用体。 给联合体其中⼀个成…

2024阿里云域名优惠口令免费领取,COM、CN和xin域名口令

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

【QT入门】 自定义标题栏界面qss美化+按钮功能实现

往期回顾&#xff1a; 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现 一、最终效果 二、…

【JAVASE】学习类与对象的创建和实例化

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 掌握类的定义方式以及对象的实例化 2. …

MVCC的实现原理

简介 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。 MVCC的实现原理 我们在了解MVCC之前&#xff0c;首先先了解一下几个比较常见的锁。 **读锁&#xff1a;**也叫共享锁、S锁&#xff0c;若事务T对数据对象A加上S锁&#xff0c;则事务…

一维卷积神经网络的特征可视化

随着以深度学习为代表的人工智能技术的不断发展&#xff0c;许多具有重要意义的深度学习模型和算法被开发出来&#xff0c;应用于计算机视觉、自然语言处理、语音处理、生物医疗、金融应用等众多行业领域。深度学习先进的数据挖掘、训练和分析能力来源于深度神经网络的海量模型…

使用OpenCV4.9的随机生成器和文本

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 4.9基本绘图 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用随机数生…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

分发饼干(力扣455)

文章目录 题目贪心算法思想概述关键要素解题步骤优缺点优点缺点 应用领域 题解一、思路二、解题方法三、Code 总结 题目 Problem: 455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&am…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中&#xff0c;遇到了两个类似的需求&#xff1a;都是基于 Stream 的父子树形结构操作&#xff0c;返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识&#xff0c;现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定&#xff1f; Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化&#xff0c;如果有变化&#xff0c;则更改Model中的数据&#xff0c;更新model中的数据时&#xff0c;数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么&#xff1f;✍事务的特性&#xff08;四个&#xff09;✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么&#xff1f; 事务是由一个或多个SQL语句构成的&#xff0c;在事务中&#xff0c;这些的SQL不可分割&#xff0c;是一个整体&#xff0c;整个事…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…