力扣-Hot100-技巧【算法学习day.31】

server/2024/11/15 3:28:35/

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.只出现一次的数字

题目链接:136. 只出现一次的数字 - 力扣(LeetCode)

题面:

基本分析:用异或,当两数相同时,异或结果是0,而0和A异或答案是A,由此线性遍历数组,记录异或结果,最终结果则为出现一次的元素 

代码:

class Solution {public int singleNumber(int[] nums) {Arrays.sort(nums);int l = 1;int ans = 0;int n = nums.length;if(n==0)return 0;if(n==1)return nums[0];while(l<n){if(nums[l]!=nums[l-1]){ans = nums[l-1];break;}l+=2;}if(nums[n-1]!=nums[n-2])ans = nums[n-1];return ans;}
}

2.多数元素

题目链接:169. 多数元素 - 力扣(LeetCode)

题面:

基本分析:可以采用哈希表,也可以排序后取索引为n/2的元素,还可以采用摩尔投票,详细可以看力扣的大佬题解

代码:

class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer> map = new HashMap<>();int n = nums.length;int flag = n/2;int ans = 0;for(int a:nums){map.put(a,map.getOrDefault(a,0)+1);if(map.get(a)>flag){ans = a;break;}}return ans;}
}

3.颜色分类

题目链接:75. 颜色分类 - 力扣(LeetCode)

题面:

基本分析:可以采用双指针前后遍历进行排序,我采取的是一个稍微复杂点的双指针

代码: 

class Solution {public void sortColors(int[] nums) {int n = nums.length;int[] ans = new int[n];Arrays.fill(ans,1);int l = 0;int r = n-1;for(int i = 0;i<n;i++){if(nums[i]==1)continue;if(nums[i]==0)ans[l++] = 0;else if(nums[i]==2)ans[r--]=2;}for(int i =0;i<n;i++)nums[i]=ans[i];}
}

4.下一个排列

题目链接:31. 下一个排列 - 力扣(LeetCode)

题面:

基本分析:想找到下一个排列,可以从后往前遍历,找到第一个小于最后一个元素的数,记其索引为k,然后交换,由于最后一个数更大,他被调到高位后整个排列就更大了,为了让这个排序尽可能小,就把k之后的数从小到大排序

代码:

class Solution {public void nextPermutation(int[] nums) {int n = nums.length, k = n - 1;while (k - 1 >= 0 && nums[k - 1] >= nums[k]) k--;if (k == 0) {reverse(nums, 0, n - 1);} else {int u = k;while (u + 1 < n && nums[u + 1] > nums[k - 1]) u++;swap(nums, k - 1, u);reverse(nums, k, n - 1);}}void reverse(int[] nums, int a, int b) {int l = a, r = b;while (l < r) swap(nums, l++, r--);}void swap(int[] nums, int a, int b) {int c = nums[a];nums[a] = nums[b];nums[b] = c;}
}

5.寻找重复数

题目链接:287. 寻找重复数 - 力扣(LeetCode)

题面:

基本分析:采用循环链表,详细看大佬题解,非常巧妙

代码:

class Solution {public int findDuplicate(int[] nums) {int slow = nums[0];int fast = nums[nums[0]];while(slow!=fast){slow = nums[slow];fast = nums[nums[fast]];}int flag = 0;while(flag!=slow){flag = nums[flag];slow = nums[slow];}return slow;}
}

后言

上面是力扣Hot100的技巧专题,下一篇会有专题,希望有所帮助,一同进步,共勉!


http://www.ppmy.cn/server/142007.html

相关文章

Window.history API学习笔记

Window.history API学习笔记 在现代前端开发中&#xff0c;单页应用&#xff08;SPA&#xff09;的流行让我们对于页面的浏览历史管理需求愈加明显。window.history API作为浏览器提供的原生API&#xff0c;能够帮助开发者更加细致地控制用户的导航体验。本文将介绍window.his…

通过SpringTask模拟打印机定时向数据库传入模拟数据

目录 一、SpringTask简介及使用方法 1.简介 2.使用方法 1&#xff09;在启动类上加上EnableScheduling注解 2&#xff09;编写定时任务类Task 3.注意事项 二、实现模拟打印机定时向数据库传入数据 1.用到的DTO类 2.用到的Mapper 3.Task类 一、SpringTask简介及使用方…

SpringBoot(十五)springboot集成Sentinel

目前负责的业务一直有一个小问题没有太好的解决办法,这个小问题是什么呢?传说中的学生选课。 这玩意跟商城的秒杀还不一样,商城的秒杀是萝卜多,坑少,最后不一定能秒杀的到。学生选课是一个萝卜一个坑,最后你一定能选上课。这么相对来说,商城秒杀要比学生选课的难度要高一…

Vuex 与 Pinia:Vue 状态管理库的选择与对比

1. Vuex 与 Pinia 概述 Vuex Vuex 是 Vue 官方的状态管理库&#xff0c;首次发布于 Vue 2.x&#xff0c;专门为 Vue 应用设计的全局状态管理工具。Vuex 将所有的状态放在一个全局 store 中&#xff0c;组件通过分发&#xff08;dispatch&#xff09;动作&#xff08;actions&…

如何优化Kafka消费者的性能

要优化 Kafka 消费者性能&#xff0c;你可以考虑以下策略&#xff1a; 并行消费&#xff1a;通过增加消费者组中的消费者数量来并行处理更多的消息&#xff0c;从而提升消费速度。 批量消费&#xff1a;配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…

HDFS新增节点和删除datanode节点

在实际的hadoop环境中&#xff0c;有时我们需要新增或者删除datanode节点&#xff0c;来达到扩容或缩容的目的&#xff0c;本文就来讲解如何新增和删除datanode。 新增节点和删除节点会涉及两个关键的配置项&#xff08;hdfs-site.xml文件中&#xff09;&#xff1a; dfs.hos…

Unet++改进28:添加PPA(2024最新改进方法)|多分支特征提取策略,捕获不同尺度和层次的特征信息。

本文内容:添加PPA 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 红外小目标检测是一项重要的计算机视觉任务,涉及对红外图像中通常只有几个像素的微小目标进行识别和定位。然而,由于红外图像中物体的体积小,背景一般比较复杂,这给红外图像的识别带来…

springboot读取modbus数据

1、引入依赖 jlibmodbus <dependency><groupId>com.intelligt.modbus</groupId><artifactId>jlibmodbus</artifactId><version>1.2.9.7</version> </dependency> 2、数据获取 public String processData(String ip) {tr…