08模拟法 + 技巧 + 数学 + 缓存(D2_技巧)

news/2025/2/15 23:05:12/

目录

1. 只出现一次的数字(简单)

1.1. 题目描述

1.2. 解题思路

方法一:位运算

2. 多数元素(简单)

2.1. 题目描述

2.2. 解题思路

方法一:哈希表

方法二:排序

方法三:随机化

方法四:分治

方法五:Boyer-Moore 投票算法

3. 颜色分类

3.1. 题目描述

3.2. 解题思路

方法一:单指针

方法二:双指针

方法三:双指针

4. 下一个排列

4.1. 题目描述

4.2. 解题思路

方法一:两遍扫描

5. 寻找重复数

5.1. 题目描述

5.2. 解题思路

方法一:二分查找

方法二:二进制

方法三:快慢指针


1. 只出现一次的数字(简单)

1.1. 题目描述

1.2. 解题思路

方法一:位运算

class Solution {public int singleNumber(int[] nums) {int single = 0;for (int num : nums) {single ^= num;}return single;}
}

2. 多数元素(简单)

2.1. 题目描述

2.2. 解题思路

方法一:哈希表

class Solution {private Map<Integer, Integer> countNums(int[] nums) {Map<Integer, Integer> counts = new HashMap<Integer, Integer>();for (int num : nums) {if (!counts.containsKey(num)) {counts.put(num, 1);} else {counts.put(num, counts.get(num) + 1);}}return counts;}public int majorityElement(int[] nums) {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();}
}

方法二:排序

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

方法三:随机化

class Solution {private int randRange(Random rand, int min, int max) {return rand.nextInt(max - min) + min;}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) {Random rand = new Random();int majorityCount = nums.length / 2;while (true) {int candidate = nums[randRange(rand, 0, nums.length)];if (countOccurences(nums, candidate) > majorityCount) {return candidate;}}}
}

方法四:分治

class Solution {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) {// base case; the only element in an array of size 1 is the majority// element.if (lo == hi) {return nums[lo];}// recurse on left and right halves of this slice.int mid = (hi - lo) / 2 + lo;int left = majorityElementRec(nums, lo, mid);int right = majorityElementRec(nums, mid + 1, hi);// if the two halves agree on the majority element, return it.if (left == right) {return left;}// otherwise, count each element and return the "winner".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);}
}

方法五:Boyer-Moore 投票算法

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;}
}

3. 颜色分类

3.1. 题目描述

3.2. 解题思路

方法一:单指针

class Solution {public void sortColors(int[] nums) {int n = nums.length;int ptr = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}for (int i = ptr; i < n; ++i) {if (nums[i] == 1) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}}
}

方法二:双指针

Java代码:

class Solution {public void sortColors(int[] nums) {int n = nums.length;int p0 = 0, p1 = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 1) {int temp = nums[i];nums[i] = nums[p1];nums[p1] = temp;++p1;} else if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[p0];nums[p0] = temp;if (p0 < p1) {temp = nums[i];nums[i] = nums[p1];nums[p1] = temp;}++p0;++p1;}}}
}

方法三:双指针

Java代码:

class Solution {public void sortColors(int[] nums) {int n = nums.length;int p0 = 0, p2 = n - 1;for (int i = 0; i <= p2; ++i) {while (i <= p2 && nums[i] == 2) {int temp = nums[i];nums[i] = nums[p2];nums[p2] = temp;--p2;}if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[p0];nums[p0] = temp;++p0;}}}
}

4. 下一个排列

4.1. 题目描述

4.2. 解题思路

方法一:两遍扫描

class Solution {public void nextPermutation(int[] nums) {int i = nums.length - 2;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[i] >= nums[j]) {j--;}swap(nums, i, j);}reverse(nums, i + 1);}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public void reverse(int[] nums, int start) {int left = start, right = nums.length - 1;while (left < right) {swap(nums, left, right);left++;right--;}}
}

5. 寻找重复数

5.1. 题目描述

5.2. 解题思路

方法一:二分查找

class Solution {public int findDuplicate(int[] nums) {int n = nums.length;int l = 1, r = n - 1, ans = -1;while (l <= r) {int mid = (l + r) >> 1;int cnt = 0;for (int i = 0; i < n; ++i) {if (nums[i] <= mid) {cnt++;}}if (cnt <= mid) {l = mid + 1;} else {r = mid - 1;ans = mid;}}return ans;}
}

方法二:二进制

class Solution {public int findDuplicate(int[] nums) {int n = nums.length, ans = 0;int bit_max = 31;while (((n - 1) >> bit_max) == 0) {bit_max -= 1;}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)) != 0) {x += 1;}if (i >= 1 && ((i & (1 << bit)) != 0)) {y += 1;}}if (x > y) {ans |= 1 << bit;}}return ans;}
}

方法三:快慢指针

class Solution {public int findDuplicate(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.ppmy.cn/news/1572369.html

相关文章

Windows 字体导入到 Docker 指定容器

以下是将 Windows 字体导入到 Docker 指定容器的详细操作步骤&#xff1a; 1. 准备工作 确认字体文件&#xff1a;在 Windows 系统中&#xff0c;字体文件通常位于 C:\Windows\Fonts 目录下。你可以选择需要导入的字体文件&#xff0c;常见的字体文件格式有 .ttf&#xff08;…

【鸿蒙Next】优秀鸿蒙博客集锦

鸿蒙基础开发&#xff1a;多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客

haproxy+nginx负载均衡实验

准备三台虚拟机&#xff1a; HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器&#xff08;192.168.65.131&#xff09;上操作&#xff1a; 安装 HAProxy&#xff1a; sudo yum install -y haproxy编辑 HAProxy 配置…

通过服务器的 BMC(基板管理控制器)安装操作系统

一、BMC 安装操作系统的优势 无需物理接触服务器&#xff1a;通过带外管理&#xff08;Out-of-Band&#xff09;远程控制。支持虚拟介质挂载&#xff1a;直接从本地电脑上传ISO镜像到服务器。实时监控硬件状态&#xff1a;安装过程中可查看硬件日志、温度、电源等信息。二、准…

2024问题总结

20241225 XlVirtualList解决数据量大,滚动后,再点下拉会出现空白 setTimeout(() > { document.querySelector(.vxe-table--body).style.marginTop 0 }) 20241224双向数据绑定问题 加key是否已有这个元素$set慢半拍加$nextTick :key"isPlan?scope.row.dblamount:null&…

Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask

基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…

本地生活服务平台(源码+文档+部署+讲解)

引言 随着城市化进程的加速&#xff0c;本地生活服务的需求日益多样化和个性化。本地生活服务平台通过数字化手段&#xff0c;为社区居民提供了一个全面、便捷的服务体验&#xff0c;从而提升社区服务体验和生活质量。 系统概述 本地生活服务平台采用前后端分离的架构设计&a…

innovus如何分步长func和dft时钟

在Innovus工具中&#xff0c;分步处理功能时钟&#xff08;func clock&#xff09;和DFT时钟&#xff08;如扫描测试时钟&#xff09;需要结合设计模式&#xff08;Function Mode和DFT Mode&#xff09;进行约束定义、时钟树综合&#xff08;CTS&#xff09;和时序分析。跟随分…