随笔分类 -  算法

摘要:翻转二叉树 1. 误解 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNod 阅读全文
posted @ 2022-12-21 18:03 OraCat 阅读(7) 评论(0) 推荐(0) 编辑
摘要:最短无序连续子数组 力扣581. 最短无序连续子数组 思路:双指针。 将数组分成3段:有序左段、无序中段、有序右段 中段的任意值(包括最小值),都大于左段,因此可以找到无序中段的起点start:维护一个最小值min(初始最小为num[len-1]),从右向左遍历,更新最小值;当遍历过程中,出现比mi 阅读全文
posted @ 2022-10-08 19:08 OraCat 阅读(7) 评论(0) 推荐(0) 编辑
摘要:力扣283. 查找重复数 如果不考虑O(1)的额外空间,使用Map查找重复数十分简单 使用双指针。首先考虑以下两种情况: 如果数组中没有重复的数,以数组 [1,3,4,2]为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n)f(n), 其映射关系 n->f(n)为: 0->1 阅读全文
posted @ 2022-09-29 20:00 OraCat 阅读(23) 评论(0) 推荐(0) 编辑
摘要:比较版本号 想到的解1 用小数点做字符串切割,转为对数组中字符串数字的比较。 时间复杂度:O(max(m,n)),m和n分别为切割后两个字符数组的长度。 空间复杂度:O(m+n)。 解2 双指针 两个指针各自向前遍历,当遍历到小数点时,暂停,计算小数点前版本的大小,进行比较; 如果相等,两个指针继续 阅读全文
posted @ 2022-09-01 00:19 OraCat 阅读(9) 评论(0) 推荐(0) 编辑
摘要:下一个排列 第一想法是从右往左遍历,先固定第一个数,然后去找第一个比它小的数,找到后交换两数的位置,并按(两数靠左边的数,end)升序,即可完成,但是O(n)=n^2; 优解是从右往左遍历时,从下标为len-2开始向左遍历,每次都和当前下标的右边一位比较,直到找到一个比它小的数,记为n。然后从len 阅读全文
posted @ 2022-08-18 20:42 OraCat 阅读(3) 评论(0) 推荐(0) 编辑
摘要:前提:在计算快乐数时,最终结果要么变为1;要么和前面计算的值出现重复,即出现了循环。 思路1:可能出现重复,利用这一点,选择哈希表检查重复。 思路2:利用循环这一点,使用快慢指针,慢指针每次计算一次,快指针每次计算两次,如果快指针追上了慢指针,则为非快乐数。 阅读全文
posted @ 2022-07-31 01:05 OraCat 阅读(5) 评论(0) 推荐(0) 编辑
摘要:贪心 遍历数组,记录之前和, 比较 当前元素 和 [当前元素+之前和],取当中最大值作为当前和,然后更新最大和: max = Math.max(max, 当前和); public int maxSubArray(int[] nums) { int result = nums[0]; int sum 阅读全文
posted @ 2022-04-10 00:11 OraCat 阅读(2) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示