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

LeetCode Hot 100:技巧

LeetCode Hot 100:技巧

136. 只出现一次的数字

思路 1:哈希表

class Solution {
public:int singleNumber(vector<int>& nums) {unordered_map<int, int> hashMap;for (int& num : nums)hashMap[num]++;for (auto& [x, cnt] : hashMap)if (cnt == 1)return x;return -1;}
};

思路 2:异或

class Solution {
public:int singleNumber(vector<int>& nums) {int ans = 0;for (int& x : nums)ans ^= x;return ans;}
};

思路 3:排序

class Solution {
public:int singleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());for (int i = 0; i < nums.size() - 1; i += 2) {if (nums[i] != nums[i + 1])return nums[i];}return nums.back();}
};

169. 多数元素

思路 1:哈希表

class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int, int> hashMap;for (int& num : nums)hashMap[num]++;for (auto& [x, cnt] : hashMap)if (cnt > nums.size() / 2)return x;return -1;}
};

思路 2:排序

class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];}
};

思路 3:摩尔投票算法(Boyer–Moore majority vote algorithm)

class Solution {
public:int majorityElement(vector<int>& nums) {int count = 0;int candidate = nums[0];for (int &num : nums) {if (count == 0)candidate = num;if (candidate == num)count++;elsecount--;}return candidate;}
};

75. 颜色分类

思路 1:三指针

class Solution {
public:void sortColors(vector<int>& nums) {if (nums.size() < 2)return;// all in [0, zero) = 0// all in [zero, i) = 1// all in [two, nums.size() - 1] = 2int zero = 0, i = 0, two = nums.size();while (i < two) {if (nums[i] == 0) {swap(nums[zero], nums[i]);zero++;i++;} else if (nums[i] == 1)i++;else {two--;swap(nums[i], nums[two]);}}}
};

31. 下一个排列

思路 1:next_permutation

class Solution {
public:void nextPermutation(vector<int>& nums) {next_permutation(nums.begin(), nums.end());}
};

思路 2:两遍扫描

class Solution {
public:void nextPermutation(vector<int>& nums) {int n = nums.size();// Step 1: 找到一个尽量靠右的「较小数」int i = n - 2;while (i >= 0 && nums[i] >= nums[i + 1])i--;// Step 2: 找到一个在「较小数」右侧尽可能小的「较大数」if (i >= 0) {int j = n - 1;while (j > i && nums[j] <= nums[i])j--;// Step 3: 交换「较小数」和「较大数」swap(nums[i], nums[j]);}// Sterp 4: 「较大数」右边的数需要按照升序重新排列reverse(nums.begin() + i + 1, nums.end());}
};

思路 1:哈希表

class Solution {
public:int findDuplicate(vector<int>& nums) {unordered_map<int, int> hashMap;for (int& num : nums)hashMap[num]++;for (auto& [x, cnt] : hashMap)if (cnt >= 2)return x;return -1;}
};

287. 寻找重复数

思路 1:哈希表

class Solution {
public:int findDuplicate(vector<int>& nums) {unordered_map<int, int> hashMap;for (int& num : nums)hashMap[num]++;for (auto& [x, cnt] : hashMap)if (cnt >= 2)return x;return -1;}
};

思路 2:二分查找

class Solution {
public:int findDuplicate(vector<int>& nums) {int n = nums.size();int left = 0, right = n - 1;int ans = -1;while (left <= right) {int mid = left + (right - left) / 2;int count = 0;for (int& num : nums)if (num <= mid)count++;if (count <= mid)left = mid + 1;else {right = mid - 1;ans = mid;}}return ans;}
};

思路 3:二进制

class Solution {
public:int findDuplicate(vector<int>& nums) {int n = nums.size();// 确定二进制下最高位是多少int bit_max = 31;while (!((n - 1) >> bit_max))bit_max -= 1;int ans = 0;for (int bit = 0; bit <= bit_max; bit++) {int x = 0, y = 0;for (int i = 0; i < n; i++) {if (nums[i] & (1 << bit))x += 1;if (i >= 1 && (i & (1 << bit)))y += 1;}if (x > y)ans |= 1 << bit;}return ans;}
};

思路 4:快慢指针

class Solution {
public:int findDuplicate(vector<int>& nums) {int slow = 0, fast = 0;do {slow = nums[slow];fast = nums[nums[fast]];} while (slow != fast);slow = 0;while (slow != fast) {slow = nums[slow];fast = nums[fast];}return slow;}
};

http://www.mrgr.cn/news/61544.html

相关文章:

  • AWS云计算概览(自用留存,整理中)
  • STM32如何使用内部晶振作为晶振
  • Spark vs Flink分布式数据处理框架的全面对比与应用场景解析
  • 备战蓝桥杯 队列和queue详解
  • pytest 参数介绍
  • 【论文+源码】一个基于Vue.js的MOBA类游戏攻略分享平台
  • WPF+MVVM案例实战(十二)- 3D数字翻牌计时实现
  • 信息安全数学基础(34)正规子群和商群
  • 加强版 第四节联通组件分析与演示
  • netframework安装不上怎么办
  • LeetCode 热题 100 回顾8
  • Java——lambda表达式和StreamAPI
  • AI-Talk开发板之启动问题
  • Windows 下实验视频降噪算法 MeshFlow 详细教程
  • Java学习第六天~第七天-程序控制结构:
  • 《操作系统真象还原》第4章 保护模式入门
  • 使用Node.js内置的http模块创建简单的HTTP服务器,并根据请求的路径返回不同的文本响应。
  • LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化
  • 计算机毕业设计——ssm基于HTML5的互动游戏新闻网站的设计与实现录像演示2021
  • modelsim命令:add atv
  • 【Java数据结构】树】
  • 基于SSM积分商城管理系统的设计与实现(源码+lw+部署文档+讲解等)
  • 小红书图文无水印下载
  • 进一步认识ICMP协议
  • MySQL用户权限管理属于SQL语句中的DCL语句
  • 深入理解阻塞队列