
算法
再让我学一会吧!
Either outstanding or out
展开
-
leetcode算法第32题最长有效括号(动态规划)
题目描述:暴力求解法就不多赘述了,我们直接说动态规划的方法。思路:我们定义dp[i] 表示以下标 i字符结尾的最长有效括号的长度。我们将dp 数组全部初始化为 0 。显然有效的子串一定以‘)’ 结尾,因此我们可以知道以‘(’ 结尾的子串对应的dp 值必定为 0 ,我们只需要求解‘)’ 在dp 数组中对应位置的值。我们从前往后遍历字符串求解dp 值,我们每两个字符检查一次:1. s[i]=‘)’ 且 s[i−1]=‘(’,也就是字符串形如“……()”,我们可以推出:dp[i]=.原创 2021-10-27 20:19:34 · 203 阅读 · 0 评论 -
leetcode算法第5题之最长回文子串(动态规划)
题目描述:解法一:暴力求解原创 2021-10-27 14:08:13 · 209 阅读 · 0 评论 -
一文看懂动态规划
1.动态规划的概念 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线. 这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关...原创 2021-10-26 21:57:27 · 831 阅读 · 0 评论 -
leetcode算法第24题(两两交换链表中的节点)
题目描述:方法1:递归分析:递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链.原创 2021-09-25 17:10:23 · 120 阅读 · 0 评论 -
三种方法求递归算法的时间复杂度(递推,master定理,递归树)
三种方法:递推方法求递归算法的时间复杂性 Master定理方法求递归算法时间复杂性 递归树求解递归方程1.递推方法求递归算法的时间复杂度我们先来看一个经典的案例,汉诺塔问题汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如原创 2021-09-24 16:45:45 · 46805 阅读 · 6 评论 -
LeetCode算法第21题(合并两个有序链表)
题目描述:方法1:迭代我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(.原创 2021-09-23 22:52:02 · 139 阅读 · 0 评论 -
leetcode算法第20题(有效的括号)
题目描述:方法1:一个很巧妙地方法,但是时间空间效率非常低代码:class Solution { public boolean isValid(String s) { while(s.contains("()")||s.contains("[]")||s.contains("{}")){ if(s.contains("()")){ s=s.replace("()",""); } .原创 2021-09-22 20:09:11 · 579 阅读 · 0 评论 -
leetcode算法第19题(删除链表的倒数第N个节点)
题目描述:解析:设置两个指针,一个先走n步,然后两个指针一起走,当第二个指针走到最后的时候,第一个指针正好走到倒数第n+1个代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * .原创 2021-09-21 22:12:36 · 149 阅读 · 0 评论 -
leetcode算法第18题(四数之和)
题目描述:方法1:暴力枚举法class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> list = new ArrayList<List<Integer>>(); for(int first .原创 2021-09-20 20:33:30 · 185 阅读 · 0 评论 -
leetcode算法第15题三数之和
题目描述:解析:代码:class Solution { public List<List<Integer>> threeSum(int[] nums) { int n = nums.length; Arrays.sort(nums); //将数组进行排序 List<List<Integer>> ans = new ArrayList<List<Integer&g...原创 2021-09-19 22:09:46 · 127 阅读 · 0 评论 -
leetcode算法第12题整数转罗马数字
题目描述:解析:下面是代码:class Solution { public String intToRoman(int num) { int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String strs[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV...原创 2021-09-19 21:54:10 · 104 阅读 · 0 评论 -
leetcode算法第9题之回文数
题目描述:解析:这是我写的代码:class Solution { public boolean isPalindrome(int x) { if(x < 0) { return false; } int n = 0; int temp = x; if(x % 10 == 0 && x >= 10) { return ..原创 2021-09-19 21:23:26 · 128 阅读 · 0 评论 -
leetcode算法第7题整数反转
题目描述:解析:这个题不难,需要注意的是反转后是否超出32位有符号整数范围。我的解决办法就是使用double,用double来接收,最后来判断class Solution { public int reverse(int x) { int temp = x; double y = 0; int count = 0; while(temp != 0) { count++; .原创 2021-09-19 21:01:39 · 138 阅读 · 0 评论 -
leetcode算法第6题之Z字形变换
题目描述:方法1:二维数组解题思路:二维数组的方法是最暴力的,但是时间复杂度和空间复杂度都很高代码:class Solution { public String convert(String s, int numRows) { int len = s.length(); int count = 0; int V = 2 * numRows - 2; int column = numRows - 1; .原创 2021-09-19 20:24:16 · 117 阅读 · 0 评论 -
leetcode算法第3题之无重复字符的最长子串
题目描述:解法1:滑动窗口代码:class Solution { public int lengthOfLongestSubstring(String s) { int length = s.length(); HashSet<Character> set = new HashSet<Character>(); int rk = -1; int maxLength = 0; ..原创 2021-09-19 19:42:47 · 218 阅读 · 0 评论 -
leetcode算法第2题之两数相加(链表)
题目描述:方法1:模拟代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val ...原创 2021-09-19 17:40:42 · 322 阅读 · 0 评论 -
lletcode算法第1题之两数之和
题目描述:解方法1:暴力枚举法没错,我想出来的也是这一种方法,就是最笨的,暴力枚举求解法java代码:class Solution { public int[] twoSum(int[] nums, int target) { int []list = new int[2]; for(int i = 0; i < nums.length; i++) { if(i > 0 && nums[i] =原创 2021-09-19 17:12:51 · 132 阅读 · 0 评论