diff --git a/src/main/java/dynamic_programming/MinDistance.java b/src/main/java/dynamic_programming/MinDistance.java new file mode 100644 index 0000000..ccf8ed2 --- /dev/null +++ b/src/main/java/dynamic_programming/MinDistance.java @@ -0,0 +1,27 @@ +package dynamic_programming; +/** + * 题目: 583. 两个字符串的删除操作 (minDistance) + * 描述:给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 + * 每步 可以删除任意一个字符串中的一个字符。 + + 示例 1: + 输入: word1 = "sea", word2 = "eat" + 输出: 2 + 解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea" + + * 链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ + */ +public class MinDistance { + public int minDistance(String word1, String word2) { + int len1=word1.length(),len2=word2.length(); + int[][]dp=new int[len1+1][len2+1]; + for (int i = 1; i <= len1; i++) { + for (int j = 1; j <= len2; j++) { + if(word1.charAt(i-1)==word2.charAt(j-1)) + dp[i][j]=dp[i-1][j-1]+1; + else dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]); + } + } + return len1+len2-2*dp[len1][len2]; + } +} diff --git a/src/main/java/dynamic_programming/minDistance2.java b/src/main/java/dynamic_programming/minDistance2.java new file mode 100644 index 0000000..1d104e7 --- /dev/null +++ b/src/main/java/dynamic_programming/minDistance2.java @@ -0,0 +1,48 @@ +package dynamic_programming; +/** + * 题目: 72. 编辑距离 (minDistance) + * 描述:给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 + * 你可以对一个单词进行如下三种操作: + * + * 插入一个字符 + * 删除一个字符 + * 替换一个字符 + + 示例 1: + 输入:word1 = "horse", word2 = "ros" + 输出:3 + 解释: + horse -> rorse (将 'h' 替换为 'r') + rorse -> rose (删除 'r') + rose -> ros (删除 'e') + + * 链接:https://leetcode.cn/problems/edit-distance/ + */ +//不会 +public class minDistance2 { + //https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html#%E6%80%9D%E8%B7%AF + public int minDistance(String word1, String word2) { + int m = word1.length(); + int n = word2.length(); + int[][] dp = new int[m + 1][n + 1]; + // 初始化 + for (int i = 1; i <= m; i++) { + dp[i][0] = i; + } + for (int j = 1; j <= n; j++) { + dp[0][j] = j; + } + for (int i = 1; i <= m; i++) { + for (int j = 1; j <= n; j++) { + // 因为dp数组有效位从1开始 + // 所以当前遍历到的字符串的位置为i-1 | j-1 + if (word1.charAt(i - 1) == word2.charAt(j - 1)) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1; + } + } + } + return dp[m][n]; + } +} diff --git a/src/main/java/trick/MajorityElement.java b/src/main/java/trick/MajorityElement.java new file mode 100644 index 0000000..302aa35 --- /dev/null +++ b/src/main/java/trick/MajorityElement.java @@ -0,0 +1,28 @@ +package trick; +/** + * 题目: 169. 多数元素 (majorityElement) + * 描述:给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 + * 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 + * + 示例 1: + 输入:nums = [3,2,3] + 输出:3 + + * 链接:https://leetcode.cn/problems/majority-element/ + */ +public class MajorityElement { + public int majorityElement(int[] nums) { + int candidate = 0, count = 0; + for (int num : nums) { + if (count == 0) { + candidate = num; // 选举新候选 + count = 1; + } else if (num == candidate) { + count++; // 支持候选者 + } else { + count--; // 反对候选者 + } + } + return candidate; + } +} \ No newline at end of file diff --git a/src/main/java/trick/SingleNumber.java b/src/main/java/trick/SingleNumber.java new file mode 100644 index 0000000..97d6aa7 --- /dev/null +++ b/src/main/java/trick/SingleNumber.java @@ -0,0 +1,39 @@ +package trick; + +import java.util.HashSet; + +/** + * 题目: 136. 只出现一次的数字 (singleNumber) + * 描述:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 + * 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 + * + 示例 1: + 输入:nums = [2,2,1] + 输出:1 + + * 链接:https://leetcode.cn/problems/single-number/ + */ +public class SingleNumber { + public int singleNumber(int[] nums) { + HashSet set = new HashSet<>(); + for (int num : nums) { + if (!set.add(num)) // add() 返回 false 表示已经存在 + set.remove(num); + } + // 直接从 set 里“弹”出唯一的元素 + return set.iterator().next(); + } + + /** + * 直接对所有数做位异或 + 异或满足 “a^a=0, 0^b=b” 的特性,所以成对出现的数都会被异或消掉,最后剩下的就是那个只出现一次的数。 + */ + public int singleNumber2(int[] nums) { + int res = 0; + for (int num : nums) { + res ^= num; + } + return res; + } + +}