LeetCode解题报告
一步一步往上走
-小黑-
要不断进步~
展开
-
初级算法 | 买卖股票最佳时机
初级算法买卖股票的最佳时机 II题目分析: 根据给出的数组和提示发现,第二天如果股票有所下降第一天就不会买入,如果买入就会亏本,如果第三天价格有所上升,则会在第二天才买入,看第四天价格是否有所上升或下降,如果下降,在第三天就要卖出;如果一直上升,则不卖出,上升最大值—开始上升时最小值得出利润。如果价格一直是下降的,则在上升到最大值时卖出后一直不买入。 使用for循环遍历数组判断价格是否有所上升,计算各阶段利润总和即可。 这种方法也叫贪心算法,贪心算法是指,在对问题求解时,总是做出在当前原创 2021-06-17 22:04:12 · 326 阅读 · 1 评论 -
打家劫舍『java实现』
题目思路record:错误思路!当数组数量大于2时,只考虑了数组第0,2,4…位置的总和与第1,3,5位置的总和比较。但是,没考虑到如果某几个不相邻的数的和都比这两个和大呢?所以该方法是不可行的。正确思路:动态规划和滑动数组(减少空间复杂度)动态规划基本思想:动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题原创 2020-09-21 18:32:32 · 730 阅读 · 0 评论 -
最短无序连续子数组『java实现』
题目解法一:优化的暴力算法基于选择排序算法的基础上,我们可以遍历比较每一个数组元素,找到左边和右边不正确的排序位置,然后通过(L-r+1)得到该数组排序不正确的长度。算法实现class Solution { public int findUnsortedSubarray(int[] nums) { int L = nums.length; int r = 0; for(int i=0;i<nums.length-1;i++){原创 2020-08-30 23:20:57 · 310 阅读 · 0 评论 -
合并两个有序链表『java实现』
题目:解题思想:创建一个有带头结点的新链表,比较L1 与L2的结点值,若L1当前的结点值小于或等于L2当前的结点值,把小的先放进新链表中,然后再比较L1的下一个结点,直至为空。也就是如下的迭代思想了。个人在思想出现误区: 创建新链表,然后比较L1和L2的结点值,若L1<L2的结点值的话,直接把L1 和 L2放进了新的链表中,然后新链表的最后一个结点值 再与L1的下一个结点值比较,但是发现,思考不全面,也没办法实现。官方解答:最终过程:详细过程参考LeetCode官方解答算法实现/原创 2020-08-11 18:04:22 · 4104 阅读 · 2 评论 -
实现strStr:模式串匹配『java实现』
题目:解题方法:看到题目首先想到的是,该题可以使用BF算法KMP算法还有官方解答的方法解法一:BF算法:回溯思路:定义两个指针,一个代表主串位置;一个代表子串位置,两两逐一比较,如果不成功,主串指针回溯,比较下一个,子串回0。直到比较完子串的字符,都相等则返回在主串与子串比较的第一个字符相等时的位置。【代码实现:】class Solution { public int strStr(String haystack, String needle) { in原创 2020-07-30 17:37:48 · 110 阅读 · 0 评论 -
移除元素『java实现』
题目:思路:根据题目,我们可以用2个变量来分别记录长度和数组上与val元素比较的各个位置。图解:代码:class Solution { public int removeElement(int[] nums, int val) { int i = 0; for(int j = 0;j < nums.length;j++){ if(nums[j] != val){ nums[i] = nums原创 2020-07-27 00:07:17 · 171 阅读 · 0 评论 -
最长公共前缀『java实现』
题目:思路:纵向遍历,从前往后遍历所有字符串的每一列。比较相同列上的字符是否相同,相同继续进行下一列的比较,不同则不属于公共前缀。算法实现:class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } for(int i = 0; i <原创 2020-07-23 23:28:49 · 825 阅读 · 0 评论 -
罗马数字转整数『java实现』
题目:解法一思路:先把罗马数字转化为整数判断条件:正常:罗马数字中小的数字在右边,则直接做加法运算。特例:罗马数字中大的数字若在右边的话,则需做减法运算。所以,通过遍历往后看一位,判断是做加法运算还是减法运算。class Solution { public int romanToInt(String s) { int sum = 0; int pre = getValue(s.charAt(0)); for(int i=1; i<原创 2020-07-22 20:34:37 · 556 阅读 · 0 评论