leetcode hot100特殊题型

ops/2025/3/17 13:09:09/

1️⃣4️⃣ 技巧(特殊题型、数学、位运算等)

136. 只出现一次的数字

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

题解:

  • 涉及数字的要求线性时间的, 一般尝试能不能用位运算实现

  • 只出现一次的数字, 多个数字异或, 两个相同的数字异或为0, 那么最终剩下的就是只出现一次的数字

  • class Solution {public int singleNumber(int[] nums) {int n = nums.length;if(n==1){return nums[0];}int res = nums[0];for(int i=1;i<n;i++){res = res^nums[i];}return res;}
    }
    

169. 多数元素

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

题解:

  • 第一种, 使用哈希表存储每个元素出现的个数, 超过n/2的即为多数元素, 多数元素只可能有一个, 所以找到即可return

  • 第二种, 由于多数元素总是>n/2的, 因此排序后索引值n/2处必定是多数元素.

  • class Solution {public int majorityElement(int[] nums) {// int n = nums.length;// int cnt=0;// Map<Integer,Integer> map = new HashMap<>();// for(int i=0;i<n;i++){//     map.put(nums[i],map.getOrDefault(nums[i],0)+1);//     if(map.getOrDefault(nums[i],0)>(n>>1)){//         return nums[i];//     }// }// return cnt;Arrays.sort(nums);return nums[nums.length/2];}
    }
    

75. 颜色分类荷兰国旗问题

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

题解:

  • 只有三个元素, 那么遇到红色插入0后, 遇到蓝色插入2前即可

  • class Solution {public void sortColors(int[] nums) {int n = nums.length;int l=0,r=n-1;int idx=0;while(idx<n&&idx<=r){if(nums[idx]==0){int temp = nums[l];nums[l] = nums[idx];nums[idx] = temp;l++;idx++;}else if(nums[idx]==2){int temp = nums[r];nums[r] = nums[idx];nums[idx] = temp;r--;//遇到蓝色索引不能增加, 因为现在还未处理交换而来的尾部的新数据}else{idx++;}}}
    }
    

31. 下一个排列

题目太长了,简单来说就是给定一个整型数组, 找出当前排列代表数字的下一个大于它的最小数组.例: [1,2,3] 下一个就是[1,3,2], 如果当前即为数组能代表的最大数字, 那么返回最小排列,例: [3,2,1], 下一个就是[1,2,3]

题解:

  • 数组排列, 寻找移动的规律:

    • 从后至前找到第一个小于当前数字的数字, 比如1,3,4,5,2,1, 找到的就是4
    • 然后在尾部的降序数组中找到最小的能够刚好大于当前数字的数字, 上述找到的就是5,
    • 交换两个数字,变为1,3,5,4,2,1 然后反转尾部降序的数组即可
    • 变为1,3,5,1,2,4
  • class Solution {public static int findMinLarge(int[] nums,int start, int end,int target){int res = Integer.MAX_VALUE;int idx=0;for(int i=start;i<=end;i++){if(nums[i] > target){if(nums[i]<=res){res = nums[i];idx = i;}}}return  idx;}public static void swap(int[] nums,int tag1,int tag2){int temp = nums[tag1];nums[tag1] = nums[tag2];nums[tag2] = temp;}public static void reverse(int[] nums, int start,int end){while(start <= end){int temp = nums[start];nums[start++] = nums[end];nums[end--] = temp;}}public void nextPermutation(int[] nums) {int n = nums.length;// int flag = 0;for(int i=n-1;i>=1;i--){if(nums[i-1]<nums[i]){int idx = findMinLarge(nums,i,n-1,nums[i-1]);swap(nums,i-1,idx);reverse(nums,i,n-1);// flag=1;return;}}// if(flag==0){reverse(nums,0,n-1);// }}}
    

287. 寻找重复数

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

题解:

  • 对于0-n的索引的值, 都会指向1-n, 那么必然会有存在0~n有两个或者多个索引的值是重复的, 由于值不会是0, 那么0必然会作为一个外部指向内部的指针, 内部就是1~n的循环指向

  • 那么既然这是一个环, 重复元素肯定是环的入口, 使用快慢指针即可得到快慢指针相遇点

  • 经由前面快慢指针的题可以知道, slow到入口的长度=0索引到入口的长度,二者相遇点即为环的入口就是重复值

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

http://www.ppmy.cn/ops/166497.html

相关文章

解锁健康密码:拥抱养生,重塑生活

在当下&#xff0c;快节奏的生活如汹涌浪潮&#xff0c;裹挟着我们一路向前。高强度的工作、繁杂的生活琐事&#xff0c;让人们在忙碌中常常忽略了自身健康。然而&#xff0c;健康并非从天而降的幸运&#xff0c;而是精心呵护的成果&#xff0c;养生则是开启健康之门的钥匙。​…

PyCharm如何有效地添加源与库?

在使用PyCharm进行Python开发的时候&#xff0c;很多时候我们需要添加库或者设置源。这些操作可以帮助我们更方便地管理项目依赖&#xff0c;提升开发效率。接下来我会详细介绍如何在PyCharm中添加源和库&#xff0c;让你的开发环境更加灵活&#xff01; 第一步&#xff1a;安…

新型XCSSET恶意软件利用增强混淆技术攻击macOS用户

微软威胁情报团队发现了一种新型的XCSSET变种&#xff0c;这是一种复杂的模块化macOS恶意软件&#xff0c;能够感染Xcode项目&#xff0c;并在开发者构建这些项目时执行。 这是自2022年以来的首个已知XCSSET变种&#xff0c;采用了增强的混淆方法、更新的持久化机制以及新的感…

C++单例模式精解

单例模式&#xff08;重点*&#xff09; 单例模式是23种常用设计模式中最简单的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例&#xff0c;即一个类只有一个对象。 将单…

【Spring】SpringIOC详解,包括源码分析,xml以及注解开发

SpringIOC Spring简介 ​ Spring是一个开源框架&#xff0c;它由[Rod Johnson]创建。它是为了解决企业应用开发的复杂性而创建的。 ​ 目前是JavaEE开发的灵魂框架。他可以简化JavaEE开发&#xff0c;可以非常方便整合其他框架&#xff0c;无侵入的进行功能增强。 ​ Sprin…

如何优雅地将Collection转为Map?

将Collection转换为Map是常见的需求&#xff0c;尤其是在处理数据时需要快速查找或去重。以下是几种常见的方法&#xff0c;包括使用谷歌的Maps.uniqueIndex、Hutool的CollUtil.toMap和Java Stream API的Collectors.toMap三种方法。 谷歌的Maps.uniqueIndex /*** 使用com.goo…

OSPF | LSDB 链路状态数据库 / SPF 算法 / 实验

注&#xff1a;本文为 “OSPF | LSDB / SPF ” 相关文章合辑。 LSDB 和 SPF 算法 潇湘浪子的蹋马骨汤 发布 2019-02-15 23:58:46 1. 链路状态数据库 (LSDB) 链路状态协议除了执行洪泛扩散链路状态通告&#xff08;LSA&#xff09;以及发现邻居等任务外&#xff0c;其第三个任…

电子电气架构 --- 智能电动汽车的品牌竞争转变

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人生是一场骗局&#xff0c;最大的任务根本不是什么买车买房&#xff0c;也不是及时行乐&#xff0c;这就…