当前位置: 首页 > news >正文

Leetcode经典题4--查找数组中的多数元素+Boyer-Moore 投票算法

题目描述

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

输入输出示例

输入:nums = [2,2,1,1,1,2,2]

输出:2

解题方案

方式一:暴力枚举(不推荐)

算法思路:最简单的暴力方法是,枚举数组中的每个元素,再遍历一遍数组统计其出现次数。

复杂度分析

该方法的时间复杂度是 O(n2),会超出时间限制,因此我们需要找出时间复杂度小于 O(n2) 的优秀做法。

方式二:哈希表

算法思想:我们知道出现次数最多的元素大于 ⌊n/2⌋ 次,所以可以用哈希表来快速统计每个元素出现的次数。我们使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

实现步骤:

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

实现代码:

class Solution {//方法的作用:遍历数组中的元素,将元素以及其出现次数加入到Map集合当中private Map<Integer, Integer> countNums(int[] nums) {Map<Integer, Integer> counts = new HashMap<Integer, Integer>();for (int num : nums) {if (!counts.containsKey(num)) {//如果是第一次添加进Map集合的情况counts.put(num, 1);} else {//如果不是第一次添加,需要根据KEY获取对应的value进行添加counts.put(num, counts.get(num) + 1);}}return counts;}public int majorityElement(int[] nums) {//1.首先将数组中的元素放入到Map集合当中Map<Integer, Integer> counts = countNums(nums);//存储出现次数最多的元素Map.Entry<Integer, Integer> majorityEntry = null;for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {majorityEntry = entry;}}return majorityEntry.getKey();}
}

Map.Entry

1.所属的类和接口体系

Map.Entry是一个接口,它定义在java.util包下,位于 Java 的集合框架中。这个接口是Map接口的一个内部接口,用于描述Map中的一个键值对元素(也就是一个映射关系,包含了对应的键以及与该键关联的值)。

Map接口常见的实现类有HashMap、TreeMap、LinkedHashMap等,而不管是哪种具体的Map实现类,它们内部存储的都是一个个的键值对,这些键值对在代码层面就可以用Map.Entry接口类型来进行操作和表示。

2.主要的方法和作用

Map.Entry接口提供了几个常用方法来获取和操作对应的键值对信息:

  • getKey()方法:用于获取该键值对中的键。例如,对于一个Map.Entry类型的变量entry,通过entry.getKey()就能得到对应的String类型的键。
  • getValue()方法:用于获取该键值对中的值。沿用上面的例子,通过entry.getValue()就能获取到对应的Integer类型的值。
  • setValue(V value)方法(这里的V是对应值的泛型类型):可以用于修改当前键值对中的值,不过要注意,并不是所有实现了Map.Entry接口的类都支持修改值操作,像HashMap中对应的Entry是支持的,而对于不可变的Map实现(如Collections.unmodifiableMap返回的Map)其内部的Entry就不支持修改值操作。

在代码中,经常会使用迭代器或者for-each循环遍历Map的entrySet()(这个方法返回一个包含所有Map.Entry元素的集合)来依次获取每个键值对,进而利用上述这些方法来操作其中的键和值信息,

复杂度分析

时间复杂度:O(n),

其中 n 是数组 nums 的长度。我们遍历数组 nums 一次,对于 nums 中的每一个元素,将其插入哈希表都只需要常数时间。如果在遍历时没有维护最大值,在遍历结束后还需要对哈希表进行遍历,因为哈希表中占用的空间为 O(n)(可参考下文的空间复杂度分析),那么遍历的时间不会超过 O(n)。因此总时间复杂度为 O(n)。

空间复杂度:O(n)。

哈希表最多包含 n−⌊n/2⌋ 个键值对,所以占用的空间为 O(n)。这是因为任意一个长度为 n 的数组最多只能包含 n 个不同的值,但题中保证 nums 一定有一个众数,会占用(最少) ⌊n/2⌋+1 个数字。因此最多有 n−(⌊n/2⌋+1) 个不同的其他数字,所以最多有 n−⌊n/2⌋ 个不同的元素。

方法三:排序

算法思想

如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 ⌊n/2⌋ 的元素(下标从 0 开始)一定是众数。

实现步骤

对于这种算法,我们先将 nums 数组排序,然后返回上文所说的下标对应的元素。

下面的图中解释了为什么这种策略是有效的。在下图中,第一个例子是 n 为奇数的情况,第二个例子是 n 为偶数的情况。

 对于每种情况,

数组上面的线表示如果众数是数组中的最小值时覆盖的下标,

数组下面的线表示如果众数是数组中的最大值时覆盖的下标。

对于其他的情况,这条线会在这两种极端情况的中间。

对于这两种极端情况,它们会在下标为 ⌊n/2⌋ 的地方有重叠。因此,无论众数是多少,返回 ⌊n/2⌋ 下标对应的值都是正确的。

class Solution {public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length / 2];}
}

复杂度分析

时间复杂度:O(nlogn)。

将数组排序的时间复杂度为 O(nlogn)。

空间复杂度:O(logn)。

如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1) 的额外空间。

方法四:随机化

算法思想

因为超过 ⌊n/2⌋ 的数组下标被众数占据了,这样我们随机挑选一个下标对应的元素并验证,有很大的概率能找到众数。

实现思路

由于一个给定的下标对应的数字很有可能是众数,我们随机挑选一个下标,检查它是否是众数,如果是就返回,否则继续随机挑选。

实现代码:

class Solution {//生成一个再区间[min,max)之间的随机数private int randRange(Random rand, int min, int max) {return rand.nextInt(max - min) + min;}//统计在数组nums当中,值为num的元素出现次数private int countOccurences(int[] nums, int num) {int count = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] == num) {count++;}}return count;}public int majorityElement(int[] nums) {//1.定义一个随机数Random rand = new Random();int majorityCount = nums.length / 2;while (true) {//2.nums[randRange(rand, 0, nums.length)]为数组中的任意一个元素,并将值赋给candidate//randRange(rand, 0, nums.length)返回随机的一个数组下标int candidate = nums[randRange(rand, 0, nums.length)];//3.如果candidate的出现次数大于数组长度的1/2,那么该元素为多数元素if (countOccurences(nums, candidate) > majorityCount) {return candidate;}}}
}

复杂度分析

时间复杂度:无法推算

理论上最坏情况下的时间复杂度为 O(∞),因为如果我们的运气很差,这个算法会一直找不到众数,随机挑选无穷多次,所以最坏时间复杂度是没有上限的。

然而,运行的期望时间是线性的。为了更简单地分析,先说服你自己:由于众数占据 超过 数组一半的位置,期望的随机次数会小于众数占据数组恰好一半的情况。因此,我们可以计算随机的期望次数(下标为 prob 为原问题,mod 为众数恰好占据数组一半数目的问题):

计算方法为:

当众数恰好占据数组的一半时,第一次随机我们有1/2的概率找到众数,

如果没有找到,则第二次随机时,包含上一次我们有1/4的概率找到众数,

以此类推。因此期望的次数为 i∗1/2^i的和,可以计算出这个和为 2,说明期望的随机次数是常数。

每一次随机后,我们需要 O(n) 的时间判断这个数是否为众数,因此期望的时间复杂度为 O(n)。

空间复杂度:O(1)。

随机方法只需要常数级别的额外空间。

方式五:分治

算法思想

如果数 a 是数组 nums 的众数,如果我们将 nums 分成两部分,那么 a 必定是至少一部分的众数。

我们可以使用反证法来证明这个结论。

假设 a 既不是左半部分的众数,也不是右半部分的众数,那么 a 出现的次数少于 l / 2 + r / 2 次,其中 l 和 r 分别是左半部分和右半部分的长度。

由于 l / 2 + r / 2

实现思路

  • 将数组分成左右两部分
  • 分别求出左半部分的众数 a1 以及右半部分的众数 a2
  • 在 a1 和 a2 中选出正确的众数。

我们使用经典的分治算法递归求解,直到所有的子问题都是长度为 1 的数组。

长度为 1 的子数组中唯一的数显然是众数,直接返回即可。

如果回溯后某区间的长度大于 1,我们必须将左右子区间的值合并。

如果它们的众数相同,那么显然这一段区间的众数是它们相同的值。

否则,我们需要比较两个众数在整个区间内出现的次数来决定该区间的众数。

实现代码

class Solution {//统计元素num在区间[lo,hi]中出现的次数private int countInRange(int[] nums, int num, int lo, int hi) {int count = 0;for (int i = lo; i <= hi; i++) {if (nums[i] == num) {count++;}}return count;}private int majorityElementRec(int[] nums, int lo, int hi) {//在大小为 1 的数组中,唯一的那个元素就是多数元素if (lo == hi) {return nums[lo];}// 分成左右两部分,做递归int mid = (hi - lo) / 2 + lo;int left = majorityElementRec(nums, lo, mid);int right = majorityElementRec(nums, mid + 1, hi);//如果左右两部分返回的多数元素相同,则直接返回即可if (left == right) {return left;}//否则,统计两个元素在数组中的出现次数,返回真正的多数元素int leftCount = countInRange(nums, left, lo, hi);int rightCount = countInRange(nums, right, lo, hi);return leftCount > rightCount ? left : right;}public int majorityElement(int[] nums) {return majorityElementRec(nums, 0, nums.length - 1);}
}

复杂度分析

时间复杂度:O(nlogn)。

函数 majority_element_rec() 会求解 2 个长度为n/2的子问题,并做两遍长度为 n 的线性扫描。因此,分治算法的时间复杂度可以表示为:

       T(n)=2T(n/2)+2n

根据 主定理,本题满足第二种情况,所以时间复杂度可以表示为:

空间复杂度:O(logn)。

尽管分治算法没有直接分配额外的数组空间,但在递归的过程中使用了额外的栈空间。算法每次将数组从中间分成两部分,所以数组长度变为 1 之前需要进行 O(logn) 次递归,即空间复杂度为 O(logn)。

方法五:Boyer-Moore 投票算法 最优解法

算法思想

如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,由于多数元素的出现次数超过数组元素的半数,显然和大于 0,从结果本身我们可以看出众数比其他数多。

实现步骤

Boyer-Moore 算法的本质和方法四中的分治十分类似。我们首先给出 Boyer-Moore 算法的详细步骤:

我们维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0;

我们遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:

   如果 x 与 candidate 相等,那么计数器 count 的值增加 1;

   如果 x 与 candidate 不等,那么计数器 count 的值减少 1

在遍历完成后,candidate 即为整个数组的众数。

我们举一个具体的例子,例如下面的这个数组:

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

在遍历到数组中的第一个元素以及每个在 | 之后的元素时,candidate 都会因为 count 的值变为 0 而发生改变。最后一次 candidate 的值从 5 变为 7,也就是这个数组中的众数。

Boyer-Moore 算法的正确性较难证明,这里给出一种较为详细的用例子辅助证明的思路,供读者参考:

首先我们根据算法步骤中对 count 的定义,可以发现:在对整个数组进行遍历的过程中,count 的值一定非负。这是因为如果 count 的值为 0,那么在这一轮遍历的开始时刻,我们会将 x 的值赋予 candidate 并在接下来的一步中将 count 的值增加 1。因此 count 的值在遍历的过程中一直保持非负。

那么 count 本身除了计数器之外,还有什么更深层次的意义呢?我们还是以数组

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

 作为例子,首先写下它在每一步遍历时 candidate 和 count 的值:

nums: [7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

candidate: 7 7 7 7 7 7 5 5 5 5 5 5 7 7 7 7

count: 1 2 1 2 1 0 1 0 1 2 1 0 1 2 3 4

 我们再定义一个变量 value,它和真正的众数 maj 绑定。在每一步遍历时,如果当前的数 x 和 maj 相等,那么 value 的值加 1,否则减 1。value 的实际意义即为:到当前的这一步遍历为止,众数出现的次数比非众数多出了多少次。我们将 value 的值也写在下方:

nums: [7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7] value: 1 2 1 2 1 0 -1 0 -1 -2 -1 0 1 2 3 4

 我们将 count 和 value 放在一起:

nums: [7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7] count: 1 2 1 2 1 0 1 0 1 2 1 0 1 2 3 4 value: 1 2 1 2 1 0 -1 0 -1 -2 -1 0 1 2 3 4

 发现在每一步遍历中,count 和 value 要么相等,要么互为相反数!

并且在候选众数 candidate 就是 maj 时,它们相等,candidate 是其它的数时,它们互为相反数!

为什么会有这么奇妙的性质呢?这并不难证明:我们将候选众数 candidate 保持不变的连续的遍历称为「一段」。

在同一段中,count 的值是根据 candidate == x 的判断进行加减的。

那么如果 candidate 恰好为 maj,那么在这一段中,count 和 value 的变化是同步的;

如果 candidate 不为 maj,那么在这一段中 count 和 value 的变化是相反的。因此就有了这样一个奇妙的性质。

这样以来,由于:

我们证明了 count 的值一直为非负,在最后一步遍历结束后也是如此;

由于 value 的值与真正的众数 maj 绑定,并且它表示「众数出现的次数比非众数多出了多少次」,那么在最后一步遍历结束后,value 的值为正数;

在最后一步遍历结束后,count 非负,value 为正数,所以它们不可能互为相反数,只可能相等,即 count == value。因此在最后「一段」中,count 的 value 的变化是同步的,也就是说,candidate 中存储的候选众数就是真正的众数 maj。

 实现代码:

class Solution {public int majorityElement(int[] nums) {int count = 0;Integer candidate = null;for (int num : nums) {//遍历数组if (count == 0) {candidate = num;}count += (num == candidate) ? 1 : -1;}return candidate;}
}

复杂度分析

时间复杂度:O(n)。

Boyer-Moore 算法只对数组进行了一次遍历。

空间复杂度:O(1)。

Boyer-Moore 算法只需要常数级别的额外空间。

通过率100% 的解法
class Solution {public int majorityElement(int[] nums) {return f(nums, 0);//从数组的第一个元素查找多数元素}public int f(int[] nums, int m){int c = nums[m], count = 1, i = m;//c记录当前位置的值  count当前元素比其他元素多出现的次数  i循环遍历索引int n = nums.length;//n数组长度while(i < n - 1 && count > 0){i++;if(nums[i] == c){count++;}else{count--;}}if(i == n - 1) return c;//到数组末尾时,count还是大于0,说明该元素出现的次数比其他元素都多else return f(nums, i + 1);//否则,看下一个元素}
}

欢迎大家点赞,评论加关注呦 

相关文章:

Leetcode经典题4--查找数组中的多数元素+Boyer-Moore 投票算法

题目描述&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 输入输出示例 输入&#xff1a;nums [2,2,1,1,1,2,2] 输出…...

ubuntu20.04 如何使用 perf 性能分析工具 以及 hotspot 性能分析可视化工具?

官方文档&#xff1a;https://perfwiki.github.io/main/ 如何安装&#xff1a;https://askubuntu.com/questions/50145/how-to-install-perf-monitoring-tool 首先是安装 perf: sudo apt-get install linux-tools-common sudo apt-get install linux-tools-generic sudo apt-…...

Scala-隐式转换

系统自动完成的&#xff1a;把一种类型的数据转成了另一种类型的数据。 不是所有的类型都可以执行隐式转换 函数的参数类型 和 返回值类型是重要的&#xff0c;它约定了把什么类型转成什么类型 //张三的函数def getAge():Double{8.5}//函数名&#xff1a;tranform 不重要//函…...

基于Java和Vue开发的漫画阅读软件漫画阅读小程序漫画APP

前景分析 受众广泛&#xff1a;漫画的受众群体广泛&#xff0c;不仅限于青少年&#xff0c;还涵盖了成年人等多个年龄层和社会阶层。漫画文化在全球范围内的影响力不断扩大&#xff0c;未来漫画软件创业可以考虑全球市场的拓展。 市场需求大&#xff1a;数字化阅读趋势下&…...

租赁小程序的优势与应用场景解析

内容概要 租赁小程序&#xff0c;听起来是不是很酷&#xff1f;其实&#xff0c;它就是一个让你可以方便地租借各种高成本但用得不频繁的商品的平台。想象一下&#xff0c;当你需要租一件派对用的华丽小礼服&#xff0c;或是想体验一下超酷的运动器材&#xff0c;租赁小程序就…...

CC-Link IEFB转Modbus TCP协议网关(技术分享)

一&#xff0c;设备主要功能 捷米特JM-CCLKIE-TCP网关实现连接到CC-Link IE Field Basic总线中做为从站使用&#xff0c;连接到Modbus TCP总线中做为主站或从站使用。 应用广泛&#xff1a;捷米特JM-CCLKIE-TCP广泛应用于支持Modbus TCP接口的上位机、变频器、仪表、马保等等…...

开发手札:Win+Mac下工程多开联调

最近完成一个Windows/Android/IOS三端多人网络协同项目V1.0版本&#xff0c;进入测试流程了。为了方便自测&#xff0c;需要用unity将一个工程打开多次&#xff0c;分别是Win/IOS/Android版本&#xff0c;进行多角色联调。 在Win开发机上&#xff0c;以Windows版本为主版…...

SSM报错:表现层方法应该返回字符串,但是返回页面

在进行SSM项目时&#xff0c;后端表现层应该返回给前端字符串&#xff0c;但是却跳转页面 1.首先检查是否使用ResponseBody注解 ResponseBody注解 作用&#xff1a;将java对象转为json格式的数据。将controller的方法返回的对象通过适当的转换器转换为指定的格式之后&#xff0…...

Unity中使用Sqlite存储本地数据

sqlite-net sqlite下载页 我的环境&#xff1a;win11、unity团结1.3.4 1.下载sqlite-net&#xff0c;将SQLite.cs脚本导入Unity 2.下载各平台依赖项&#xff0c;如dll、aar等。导入Unity并设置 3.简单列子&#xff0c;打包测试 using System; using System.IO; using SQLi…...

微信直连:商户转账到零钱API开发报错:java.security.InvalidKeyException: Illegal key size

jdk版本 解决方案&#xff1a;下载jce_policy-8&#xff0c;替换jre下的 local_policy.jar 文件 替换jdk内的jre下的 替换jre下的 JDK 8u161 之后默认使用了不限制的Policy...

语言处理程序基础

逻辑运算 正规式 有限自动机 上下文无关文法 表达式&#xff08;前缀、后缀、中缀&#xff09; 将表达式&#xff08;a-b&#xff09;*&#xff08;c5&#xff09;构造成树的步骤为&#xff1a;括号不能出现在树中&#xff1b;按照表达式的计算顺序来依次构造&#xff01;&…...

deepsort复现报错TypeError: tuple indices must be integers or slices, not tuple 解决

deepsort复现中遇到的TypeError: tuple indices must be integers or slices, not tuple问题的解决-CSDN博客 以上为参考教程。 复现的时候出现这个报错&#xff0c;搞了好久试了好多方法&#xff0c;包括降 scikit-learn版本&#xff0c;都不行&#xff0c;最后终于找到这个博…...

「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用

本篇将带你实现一个数字键盘应用&#xff0c;支持用户通过点击数字键输入数字并实时更新显示内容。我们将展示如何使用按钮组件和状态管理来实现一个简洁且实用的数字键盘。 关键词 UI互动应用数字键盘按钮组件状态管理用户交互 一、功能说明 数字键盘应用将实现以下功能&…...

MSSQL SQLi Labs靶场 第一关 (手工版)

一.判断是否存在注入 输入http://172.16.0.87/less-1.asp?id1页面异常 加上闭合点&#xff1a;http://172.16.0.87/less-1.asp?id1--页面正常&#xff0c;说明存在注入 二.判断数据库类型 可通过以下Payload来探测当前站点是否是MSSQL数据库&#xff0c;正常执⾏说明后台数据…...

重磅更新:CnosDB 2.3.5.4 版本上线, 性能提升,问题修复一网打尽

&#x1f4e2; 重磅更新&#xff1a;CnosDB 2.3.5.4 版本上线, 性能提升&#xff0c;问题修复一网打尽 &#x1f4e2; 我们很高兴地向大家介绍最新版本的更新&#xff0c;以下是本次更新的主要内容&#xff1a; &#x1f539; 版本号&#xff1a;2.3.5.4 &#x1f539; 发布…...

后端-编辑按钮的实现

编辑一共要实现两步&#xff1a; 1.点击编辑蹦出来一个弹窗&#xff0c;此时需要回显&#xff0c;根据id查出来这条数据 2.修改某些值之后点击保存的时候调用修改的接口 根据id查询的时候正常操作 修改值的时候要注意一些问题 mapper层的Employee和impl层的接收实体不一样...

Python语言基础入门教程

Python是一种简单易学、功能强大的编程语言&#xff0c;非常适合初学者入门。本篇博客将带你从零开始&#xff0c;学习Python的一些基础知识&#xff0c;并通过详细分析和实例帮助你理解。 一、什么是Python&#xff1f; Python是一种高级编程语言&#xff0c;具有以下特点&am…...

verilog编程规范

verilog编程规范 文章目录 verilog编程规范前言一、代码划分二、verilog编码ABCDEFG 前言 高内聚&#xff0c;低耦合&#xff0c;干净清爽的代码 一、代码划分 高内聚&#xff1a; 一个功能一个模块干净的接口提取公共的代码 低耦合&#xff1a; 模块之间低耦合尽量用少量…...

Spring Boot 的启动原理

Spring Boot 是由 Pivotal 团队发布的一个开源框架&#xff0c;它基于 Spring 框架&#xff0c;旨在简化企业级应用程序的开发过程。与传统的 Spring 项目相比&#xff0c;Spring Boot 提供了一种更加简洁、高效的方式来构建和部署应用程序。其核心理念是“约定优于配置”和“自…...

Oracle 19C RU补丁升级,从19.7to19.25 -单机

1. 环境信息&#xff1a; 角色 数据库 IP地址 数据库版本 数据库名称 源端 单实例 172.30.21.191 19.7 hfzcdb 2. 安装准备 用rman备份数据库&#xff0c;再备份下oracle目录&#xff1a; 命令&#xff1a; tar zavf oracle.tar /oracle 19.25版本关于19C的补丁内…...

Web day08 项目实战(2)

目录 查询员工&#xff1a; 在EmpController层&#xff1a; 在pojo层&#xff1a; 在EmpServiceImpl 层中&#xff1a; 在dao层&#xff1a; 新增员工: pojo层&#xff1a; EmpController层&#xff1a; 在EmpServiceImpl 层中&#xff1a; 在EmpMapper层&#xff1a; …...

生命周期(vue2和vue3的生命周期对比)有哪些?

Vue.js 提供了一套完整的数据驱动和组件化思想&#xff0c;其生命周期钩子是开发者理解组件行为的关键。以下是 Vue 2 和 Vue 3 中生命周期钩子的对比&#xff1a; Vue 2 生命周期钩子 创建阶段 beforeCreate&#xff1a;实例初始化之前调用&#xff0c;此时 data 和 methods …...

智慧信息发系统——控件磁吸

//鍙悜涓婂惛 function fun_鎺т欢纾佸惛_璁&#xff04;畻(鐏典綋y,寮曞姏鍊&#xfffd;,閫夋嫨鍖哄煙,璁&#xff04;畻鍧愭爣绫诲瀷) {const 灞忓箷椤圭洰 document.querySelectorAll(閫夋嫨鍖哄煙);var 璺濈鎴戞渶杩憏 0;var 鏈€杩戜竴娆″紩鍔&#xfffd; 0…...

【时间序列预测】基于PyTorch实现CNN_LSTM算法

文章目录 1. CNN_LSTM模型概述2. 网络结构3. 完整代码实现4.模型解析4.1 CNN层4.2 ReLU层4.3 MaxPooling层4.4 LSTM层4.5 输出层4.6 前向传播 5. 总结 在时间序列预测任务中&#xff0c;CNN&#xff08;卷积神经网络&#xff09;和LSTM&#xff08;长短期记忆网络&#xff09;是…...

Android环境搭建

Android环境搭建 第一步&#xff1a;安装 Homebrew 执行以下命令来安装 Homebrew&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"检测是否安装成功&#xff1a; brew --version第二步&#xff1a;安装 No…...

HarmonyOS 5.0应用开发——Ability与Page数据传递

【高心星出品】 文章目录 Ability与Page数据传递Page向Ability传递数据Ability向Page传递数据 Ability与Page数据传递 基于当前的应用模型&#xff0c;可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信&#xff1a;在基类Context中提供…...

【数据结构】顺序表

一、顺序表的基本概念 1.1 概念 顺序表是一种线性表的存储结构&#xff0c;其特点是&#xff1a;使用一段连续的存储空间存储线性表中的数据元素&#xff0c;通过数组实现&#xff0c;具有随机访问的能力。 可以把顺序表直接理解为数组&#xff0c;只不过这个数组里可以存各种类…...

光伏与储能软件有哪些?

随着技术的不断进步&#xff0c;光伏与储能的软件系统也层出不穷&#xff0c;为这一领域的发展提供了强有力的支持。 一、光伏设计软件 1、PVSyst 功能&#xff1a;这是一款全球广泛使用的光伏系统设计软件&#xff0c;支持光伏系统的模拟与设计&#xff0c;包括组件阵列、倾…...

AI周报(12.1-12.7)

AI应用-AI独立开发“小猫补光灯” 无论GitHub Copilot、Amazon CodeWhisperer&#xff0c;还是前面AI周报&#xff08;6.23-6.29&#xff09;Devv.ai&#xff0c;重在提高编码效率、提供编码补全和建议。小猫补光灯第一次让一个完全不会编程的产品经理&#xff0c;与AI协作&…...

windows 脚本批量管理上千台服务器实战案例

如果你们有接触服务器&#xff0c;都是知道服务器有BMC管理界面的&#xff0c;这几天我在做项目中&#xff0c;需要不断的开关机服务器&#xff0c;如果一两台服务器登录BMC界面重启服务器还好&#xff0c;如果服务器数量非常的庞大&#xff0c;成百上千台&#xff0c;我们不可…...

一级路由访问家里的二级路由设备 例如nas

家里升级千兆网&#xff0c;更换了光猫设备&#xff0c;家里走网线的话&#xff0c;只有100m速度&#xff0c;就直接用了光猫的无线&#xff0c;这次换的很顶&#xff0c;下载和打游戏也够用了&#xff0c;基本上没有网络波动。就客厅用了一个路由器&#xff0c;接了nas和摄像头…...

线程(二)——线程安全

如何理解线程安全&#xff1a; 多线程并发执行的时候&#xff0c;有时候会触发一些“bug”&#xff0c;虽然代码能够执行&#xff0c;线程也在工作&#xff0c;但是过程和结果都不符合我们的开发时的预期&#xff0c;所以我们将此类线程称之为“线程安全问题”。 例如&#xff…...

Altium Designer学习笔记 31 PCB布线优化_GND处理

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…...

第四节、电机定角度转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍用电机转动角度计算步骤&#xff0c;从而控制步进电机转角 一、 计算过程 1.1 驱动器接收一个脉冲后&#xff0c;步进电机转动一步&#xff0c;根据驱动器设置的细分值 计算一个脉冲对应电机转动的角度step_x s t e p x s t e p X … … ① step_{x…...

亚马逊云科技用生成式AI,向开发的复杂性动手了

生成式 AI、分布式扩展功能全面进化&#xff0c;还降价了。 同一天的发布&#xff0c;完全不同的方向。 今天凌晨&#xff0c;云计算巨头亚马逊云科技的 re:Invent 与大号创业公司 OpenAI 的发布「撞了车」。后者公布了一系列生成式 AI 应用&#xff0c;价格更贵、性能更强大&a…...

SharpDevelop IDE IViewContent.cs类

文件位置&#xff1a;IViewContent.cs /// <summary>/// IViewContent is the base interface for "windows" in the document area of SharpDevelop./// A view content is a view onto multiple files, or other content that opens like a document/// (e.…...

【工具变量】地级市城市全社会用电量数据(2006-2021年)

一、数据范围&#xff1a;覆盖中国300多个地级市 二、包含指标&#xff1a; 省份、地级市、年份、全社会用电量。 三、数据来源&#xff1a;国家电网查询数据。对于极大部分城市&#xff0c;国网售电量就是全社会用电量(往年的售电量和全社会用电量数据相同&#xff09;,此外…...

vue列表滚动动画效果

一、效果展示&#xff1a; 录屏2024-12-07 02.16.59 二、步骤&#xff1a; 1. 需要用<transition-group>包裹需要渲染的item列表 ⚠️注意&#xff1a;这里的:key"item.id"&#xff0c;必须要用id之类的&#xff0c;不能用index <transition-group name&qu…...

33.5 remote实战项目之设计prometheus数据源的结构

本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…...

Ceph文件存储

Ceph文件存储1.概念:数据以文件的形式存储在存储介质上&#xff0c;每个文件都有一个唯一的文件名并存储在一个目录结构中。提供方便的文件访问接口&#xff0c;支持多种文件操作&#xff0c;如创建、删除、读取、写入、复制等。用于存储和管理个人文件&#xff0c;如文档、图片…...

力扣-图论-5【算法学习day.55】

目录 前言 习题 1.移除可疑的方法 后言 前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键…...

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…...

SQL复杂查询功能介绍及示例

文章目录 1. 多表连接&#xff08;JOIN&#xff09;功能介绍应用场景示例查询及初始表格customers 表&#xff08;未查询前&#xff09;orders 表&#xff08;未查询前&#xff09;INNER JOIN 示例LEFT JOIN 示例 2. 子查询&#xff08;Subquery&#xff09;功能介绍应用场景示…...

Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用

Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…...

快速掌握HTML

目录 1. HTML文件的基本结构* 前端开发工具搭建* vscode的三个插件* 编写第一个html代码* 快速生成代码框架 *html特殊字符2. 双标签2.1 标题标签 h12.2 段落标签 p2.3 格式化标签2.4 超链接标签 a2.5 表格标签2.6 列表标签1. 无序列表&#xff1a;ul标签( 快捷键&#xff1a;u…...

Linux 音频驱动实验

音频是我们最常用到的功能&#xff0c;音频也是 linux 和安卓的重点应用场合。I.MX6ULL 带有 SAI接口&#xff0c;正点原子的 I.MX6ULL ALPHA 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片&#xff0c;本章我们就来学习一下如何使能 WM8960 驱动&#xff0c;并且通过 WM89…...

【分布式】Redis分布式缓存

一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中&#xff0c;多台服务器共同对外提供服务&#xff0c;为了提高系统的性能和可扩展性&#xff0c;通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...

几个Linux系统安装体验: 一些系统对比和使用记录

本文对一些系统做对比&#xff0c;并记录一些使用过程。 背景 本文所记录的内容&#xff0c;不保证绝对性&#xff0c;也不代表任何方的意见、意思、看法、观点。如有不适&#xff0c;权当笑料。 个人使用记录 centos7 centos7为笔者的主力系统&#xff0c;生产工具。虚拟机…...

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…...

特朗普画像

任务内容 Description 特朗普当选了&#xff0c;网上流传着很多段子&#xff0c;也出了特朗普的头像。有人说&#xff0c;特朗普 的头像像一团云。所以今年马云去了美国和特朗普谈中美企业的发展。那么你能帮 忙打印出特朗普的头像吗&#xff1f; 抽象派认为&#xff0c;特朗普…...