- 博客(31)
- 收藏
- 关注
原创 KMP算法
class Solution { public int strStr(String haystack, String needle) { int n = haystack.length(), m = needle.length(); int[] pi = new int[m]; //kmp中j是共同前缀的长度 for(int i = 1, j = 0; i < m; i ++){ while(j >
2024-02-13 13:28:59
234
1
原创 括号生成(回溯解法)
题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 有效括号组合需满足:左括号必须以正确的顺序闭合。 示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"] 示例 2: 输入:n = 1 输出:["()"] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/generate-parentheses 著作权归领扣网络所有。商业转载请联
2021-10-11 01:13:17
373
原创 经典问题:解数独
题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例: 输入:board = [[“5”,“3”,".",".",“7”,".",".",".","."],[“6”,".",".",“1”,“9”,“5”,".",".","."],[".",“9”,“8”,".","
2021-10-10 20:36:04
509
原创 子集问题(递归实现)
题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 示例 2: 输入:nums = [0] 输出:[[],[0]] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subsets 著作权归领扣网络所有。商业转载
2021-10-10 17:41:47
527
原创 戳气球问题(动态规划)
题目 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。 求所能获得硬币的最大数量。 示例 1: 输入:nums = [3,1,5,8] 输出:167 解释: nu
2021-10-09 22:04:45
424
原创 编辑距离(附带操作)
package N02; public class Solution { class Node{ int value; //选择 //0表示啥都不做,1表示插入,2表示删除,3表示替换 int choice; Node(int value, int choice){ this.value = value; this.choice = choice; } } public int minDistance(String str1, String str2)
2021-10-06 12:15:57
150
原创 外观数组(递归解法)
题目 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) = “1” countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。 前五项如下: 1 11 21 1211 111221 第一项是数字 1 描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11” 描
2021-09-29 14:39:03
240
原创 在排序数组中查找元素的第一个和最后一个的位置(左右侧边界的二分查找法)
题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解答 class Solution {
2021-09-27 23:02:06
245
原创 程序解数独问题
题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 示例: 输入:board = [[“5”,“3”,".",".",“7”,".",".",".","."],[“6”,".",".",“1”,“9”,“5”,".",".","."],[".",“9”,“8”,".","
2021-08-15 14:46:44
1277
原创 岛屿问题(无向图的通用解法)
题目 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入:grid = [ [“1”,“1”,“1”,“1”,“0”], [“1”,“1”,“0”,“1”,“0”], [“1”,“1”,“0”,“0”,“0”], [“0”,“0”,“0”,“0”,“0”] ] 输出:1 示例 2: 输入:grid = [ [“1”,“1”,“0”
2021-06-07 23:01:26
410
5
原创 从前序与中序遍历序列构造二叉树
题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal 著作权
2021-05-01 11:27:43
204
原创 HashMap通过Value获得Key的方法
首先要明确一点的是,HashMap中Key是唯一的,但是Value是不唯一的。也就是说,Value值相等,可以是两个Key,所以我们采用LinkedList来存储key的集合 public LinkedList<K> findKey(Map map, V value){ //创建用于存储Key的链表 LinkedList<K> keys = new LinkedList<>(); //通过遍历的方法来查找 Iterator iterator = map.keySe
2021-05-01 00:39:44
1014
2
原创 HashMap的遍历方法
方法一:通过EntrySet遍历 Map<K, V> map = new HashMap<>(); Iterator iterator = map.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry entry = (Map.Entry)iterator.next(); K key = (K)entry.getKey(); V value = (V)entry.getValue(); } 方法二:通过KeyS
2021-05-01 00:25:37
165
1
原创 只出现一次的数字 解法一:HashMap存储
题目 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1: 输入:nums = [2,2,3,2] 输出:3 示例 2: 输入:nums = [0,1,0,1,0,1,99] 输出:99 提示: 1 <= nums.length <= 3 * 104 -231 <= nums[i] <= 231 - 1 nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 来源:力扣(LeetCod
2021-04-30 23:46:34
384
4
原创 二叉树中最大路径和
题目 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示例 1: 输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6 示例 2: 输入:root = [-10,9,20,null,null,15,7] 输
2021-04-30 00:20:34
411
原创 回文数
题目 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrom
2021-01-26 17:41:41
174
原创 字符串转换整数
题目 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格 检查第一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前面步骤读入的这些数字转换为整数(即,“123
2021-01-25 10:33:38
1360
原创 整数反转(借助字符串反转)
上一篇: 整数反转(常规反转法) 解答 class Solution { public int reverse(int x) { //先转化为字符串 String s = Integer.toString(x); String s1 = s; //flag指示变量用来统一正负两种情况 int flag = 1; if(x < 0){ //截取负号后面的内容
2021-01-24 02:36:53
237
原创 整数反转(常规反转法)
题目 给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1: 输入:x = 123 输出:321 示例 2: 输入:x = -123 输出:-321 示例 3: 输入:x = 120 输出:21 示例 4: 输入:x = 0 输出:0 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/pr
2021-01-24 02:20:10
589
原创 Z字型变换
题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。 请你实现这个将字符串进行指定行数变换的函数: string convert(string s, int numRows); 示例 1: 输入:s = “
2021-01-23 16:13:52
163
原创 最长回文子串问题
class Solution { public String longestPalindrome(String s) { int len = s.length(); //这个二维boolean数组用来存储从i到j的状态 boolean a[][] = new boolean[len][len]; //用于存放结果的字符串 String result = ""; //这里k是字符串长度 fo
2021-01-23 00:41:53
157
原创 寻找两个正序数组的中位数问题,方法二:双指针检索法
题目: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 示例 3: 输入:nums1 = [0,0], nums
2020-12-11 14:45:49
451
原创 寻找两个正序数组的中位数问题,方法一:合并数组检索法
题目: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 示例 3: 输入:nums1 = [0,0], nums
2020-12-11 02:49:05
276
原创 经典算法:归并排序算法 java实现
package MergeSortAlgorithm; public class MergeSort { //归并,合并两个数组 public static void merge(int[] data, int start, int center, int end) { //第一个数组的首位 int i = start; //第二个数组的首位 int j = center + 1; //缓存数组 int[] tempArr = new int[end - start + 1]
2020-12-08 15:42:15
124
原创 快速排序算法,二分思想
package QuickSortAlgorithm; public class QuickSort { //快速排序算法,原地操作 public static void quickSort(int[] arr, int start, int end) { //交换辅助变量 int t; int i = start; int j = end; //结束条件 if(start >= end) return; //快排的基元 int temp = arr[start]
2020-12-08 14:49:59
573
2
原创 无重复字符的最长子串问题 (移动窗口法求解)
问题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 class Solution { public int lengthOfLongestSubstring(String s) { //本题采用滑动窗口来解决 //记录左边界 int left = 0; //记录最大值 int max = 0; //滑动窗口,用于装字符子串 Map<Character, Integ
2020-12-08 01:27:47
209
原创 两数相加问题 链表加法版
问题: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 来源:力扣(LeetCode) 链接:https://leet
2020-12-07 13:33:32
250
2
原创 两数之和问题 hashmap版
上一篇的解法容易理解,采用了暴力求解法,但是时间复杂度是O(n^2), 这里,采用了HashMap的方法,时间复杂度是O(n),实际上就是通过HashMap去掉了一层for循环,通过空间换时间,空间复杂度为O(n) 可以参考我的上一篇文章,对照阅读 两数之和 java版 package SumOfTwoNum; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Solution
2020-12-03 14:25:39
491
原创 两数之和问题 两层for循环版
两数之和问题 问题简介: 有一个数组,需要找出来满足a[i] + a[j] = target的i, j,其中target是指定的数,需要找出满足上面等式的下标i,j 解决方法:暴力求解法 package SumOfTwoNum; import java.util.Scanner; public class Solution { public static int[] findTwoSum(int[] nums, int target) { int len = nums.length; //这
2020-12-03 12:04:15
484
原创 经典算法:八皇后问题 java实现
import java.util.Scanner; public class EightQueen { private static int m = 0; //设置皇后的个数 public static int n; //棋盘 public static int[][] pan; //展示棋盘 public static void show() { System.out.println("第" + (++m) + "种解法为:"); for(int i = 0; i < n;
2020-11-26 04:31:18
333
原创 经典算法:汉罗塔问题 java实现
import java.util.Scanner; public class TowerOfHanoi { //用于记录移动的次数 static int m = 0; //展示函数 public static void move(int disk, char M, char N) { System.out.println("第" + (++m) + "次操作,将" + disk + "号盘从" + M + "移动到" + N); } public static void h
2020-11-26 03:06:40
428
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅