02 2021 档案

摘要:思路:找规律 数字范围 数字位数 数字数量 数位数量 0-9 1 10 10 10-99 2 90 180 100-999 3 900 2700 …… …… …… …… start-end digit 9*start 9*start*digit 由此,要得到第n位对应的数字,需要分三步: 1. 确定 阅读全文
posted @ 2021-02-28 23:55 zjcfrancis 阅读(55) 评论(0) 推荐(0) 编辑
摘要:思路:层次遍历 序列化: 层次遍历二叉树,注意输出符合题目要求的格式 反序列化: 初始化时除去序列化数组的左右中括号,除去逗号,将其转换成一个 String 数组 这样二叉树中每个节点的索引即为数组的下标 按序列化层次遍历的思路,一层一层构建原二叉树。 代码: 序列化与反序列化的时间复杂度均为O(n 阅读全文
posted @ 2021-02-28 23:18 zjcfrancis 阅读(64) 评论(0) 推荐(0) 编辑
摘要:思路:动态规划 对于数组B中元素B[i],它的值等于A数组中 i 左侧元素乘积,与 i 右侧元素乘积 的乘积 画表可知: B[1]= 1* A[2]* A[3]* A[4] B[2]= A[1]* 1* A[3]* A[4] B[3]= A[1]* A[2]* 1* A[4] B[4]= A[1]* 阅读全文
posted @ 2021-02-28 18:03 zjcfrancis 阅读(28) 评论(0) 推荐(0) 编辑
摘要:思路1:滑动窗口 设置一个滑动窗口与一个HashSet,用set来维护一个不重复的窗口。 即当窗口右边界遇到窗口内重复的字符时,左边界移动至右边界处。 res保存最大窗口大小,即为最长无重复字符的字串长度。 代码: class Solution { public int lengthOfLonges 阅读全文
posted @ 2021-02-28 17:01 zjcfrancis 阅读(45) 评论(0) 推荐(0) 编辑
摘要:思路: 设置两个布尔变量 increase、decrease。 当数组中存在 A[i] < A[j]时,increase = true; 当数组中存在 A[i] > A[j]时,decrease = true; 如果A数组是单调数组,则 increase和decrease中只有一个为true,或都不 阅读全文
posted @ 2021-02-28 14:53 zjcfrancis 阅读(81) 评论(0) 推荐(0) 编辑
摘要:思路:动态规划 对于一个数字x1x2……xi,它的翻译方法 f( i ) 可以分为两种情况,xi-1和xi单独翻译和整体翻译。 当xi-1和xi单独翻译时,f( i ) = f ( i - 1 ) + f( i - 2 ) 当xi-1和xi整体翻译时,f( i ) = f( i - 1 ) 设动态规 阅读全文
posted @ 2021-02-28 05:02 zjcfrancis 阅读(53) 评论(0) 推荐(0) 编辑
摘要:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节 阅读全文
posted @ 2021-02-26 18:28 zjcfrancis 阅读(35) 评论(0) 推荐(0) 编辑
摘要:思路:贪心算法 取移动每一步的最优解,即可得到答案。 所有路径都会抵达棋盘的右下角,因此直接利用原棋盘数组记录每一格移动过去的礼物最大值,最终返回棋盘右下角元素即可。 代码: 时间复杂度O(MN),空间复杂度O(1) class Solution { public int maxValue(int[ 阅读全文
posted @ 2021-02-26 03:32 zjcfrancis 阅读(43) 评论(0) 推荐(0) 编辑
摘要:原理: 大丑数=小丑数x丑数因子(2,3,5) 所有丑数的集合,必然是由这三个数组合并去重得到的: A:{1*2,2*2,3*2,4*2,5*2,6*2,8*2,10*2......} B:{1*3,2*3,3*3,4*3,5*3,6*3,8*3,10*3......} C:{1*5,2*5,3*5 阅读全文
posted @ 2021-02-25 14:54 zjcfrancis 阅读(59) 评论(0) 推荐(0) 编辑
摘要:思路:(这也是动态规划的思想) 在最低价买入,最高价卖出。 使用 min 保存最低买入价格,res 保存最大利润,遍历数组找到结果。 代码: 时间复杂度O(n),空间复杂度O(1) class Solution { public int maxProfit(int[] prices) { if (p 阅读全文
posted @ 2021-02-25 14:22 zjcfrancis 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原理:逻辑运算符的短路效应 常见的逻辑运算符有三种,即 “与 && ”,“或 || ”,“非 ! ” ;他们都具备短路效应,如下所示: if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false if(A || B) // 若 A 阅读全文
posted @ 2021-02-25 01:04 zjcfrancis 阅读(46) 评论(0) 推荐(0) 编辑
摘要:思路1: 运用HashSet中元素不重复的性质,计算sumset = sum(set(nums)),与sumnum = sum(nums) (sumset*3 - sumnum)/2即得到结果。 原理: 设所求数字为 x,其他数字和为sumy,则sumset == x+(sumy/3),sumnum 阅读全文
posted @ 2021-02-25 00:44 zjcfrancis 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原理:位运算 如果该整型数组中只有一个数字 x 出现一次,其他数字出现两次。 由于两个相同的数字异或后得0,若将 nums 中所有数字执行异或运算,留下的结果则为出现一次的数字 x。 思路: 题目中有两个数字只出现一次,nums 中所有数字执行异或运算后得到 x⊕y。 由于x≠y,则 x⊕y 二进制 阅读全文
posted @ 2021-02-25 00:06 zjcfrancis 阅读(45) 评论(0) 推荐(0) 编辑
摘要:思路: 递归回溯。 将字符串转为字符数组后,DFS搜索所有排序方案,即一次固定一个字母。 搜索时,通过swap操作来依序固定字母,得到一个排列方案,搜索后通过swap操作复原。 代码: class Solution { Set<String> list = new HashSet<>(); char 阅读全文
posted @ 2021-02-24 23:08 zjcfrancis 阅读(56) 评论(0) 推荐(0) 编辑
摘要:思路:前序遍历 dfs前序遍历二叉树,记录每条路径是否满足和为sum,不满足则删去该结点,回溯到上一个结点。 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode le 阅读全文
posted @ 2021-02-23 20:51 zjcfrancis 阅读(46) 评论(0) 推荐(0) 编辑
摘要:思路: 先序遍历,递归判断。 通过先序遍历,先判断B的根节点是否等于A中的一个节点,再从这个节点开始分别判断左子树和右子树是否相同。 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * 阅读全文
posted @ 2021-02-23 16:29 zjcfrancis 阅读(35) 评论(0) 推荐(0) 编辑
摘要:思路:DFS 从矩阵第一个元素开始,向左右上下进行DFS递归遍历,即沿一个方向搜到底回溯至上个节点,沿另一个方向搜索,以此类推。 其中当遇到不可能匹配成功的路径(越界,与目标元素不符等)时,可以进行剪枝,即提前返回。 应将已访问过的元素置空,即改为空字符‘ ’,防止之后的搜索中重复访问。 当匹配字符 阅读全文
posted @ 2021-02-22 22:58 zjcfrancis 阅读(62) 评论(0) 推荐(0) 编辑
摘要:说明: -100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。 思路:快速幂 原理: xn暴力解法是循环乘x,时间复杂度O(n),但这是线性复杂度的,会超时。 快速幂的原理则是将幂指数 n 进行分割,从而将其变为对数复杂度的计算。 下面 阅读全文
posted @ 2021-02-22 14:27 zjcfrancis 阅读(61) 评论(0) 推荐(0) 编辑
摘要:同上一篇剪绳子,题目不同点在于 n 的范围变大,当n过大时,乘积结果过大会导致溢出。 因此不能直接使用动态规划求解。 如果在上题中的动态规划中加入大数运算,虽然能得到结果,但效率过低,如下图所示: 如果使用上题中的数学方法解题,能正常得出结果,代码如下: class Solution { publi 阅读全文
posted @ 2021-02-21 14:24 zjcfrancis 阅读(46) 评论(0) 推荐(0) 编辑
摘要:思路: 1.动态规划 首先想到的肯定是暴力解法,将所有情况列举出来再计算,时间复杂度O(2^n),很明显这种做法会超时。 如何改进暴力解法呢?在计算时会发现暴力解法实际上是将求解F(n)的问题分解成求解F(n-1)的问题。 由此可以使用动态规划的解法。 定义一个数组dp,其中 dp[i] 表示的是长 阅读全文
posted @ 2021-02-21 13:41 zjcfrancis 阅读(53) 评论(0) 推荐(0) 编辑
摘要:一个二叉树的遍历序列不能决定一棵二叉树,但某些不同的遍历序列组合可以唯一确定一棵二叉树。 给定一棵二叉树的前序遍历序列和中序遍历序列可以唯一确定一棵二叉树的结构,给定一棵二叉树的后序遍历序列和中序遍历序列也可以唯一确定一棵二叉树的结构。 注意:这还有一个条件:二叉树的任意两个结点的值都不相同。 一. 阅读全文
posted @ 2021-02-19 14:52 zjcfrancis 阅读(352) 评论(0) 推荐(0) 编辑
摘要:设节点 root 为节点 p, q 的某公共祖先,若其左子节点 root.left 和右子节点 root.right 都不是 p,q 的公共祖先,则称 root 是 “最近的公共祖先” 。 根据以上定义,若 root 是 p, q 的最近公共祖先 ,则只可能为以下情况之一: p 和 q 在 root 阅读全文
posted @ 2021-02-18 23:42 zjcfrancis 阅读(51) 评论(0) 推荐(0) 编辑
摘要:位运算模拟运算 因为不熟悉,暂时照搬leetcode大佬题解 代码: class Solution { public int add(int a, int b) { while(b != 0) { // 当进位为 0 时跳出 int c = (a & b) << 1; // c = 进位 a ^= 阅读全文
posted @ 2021-02-18 22:29 zjcfrancis 阅读(26) 评论(0) 推荐(0) 编辑
摘要:思路: 1. 数学方法(求和公式) 设首项为x,项数为n,则末项为x+n-1,可得(2*x+n-1)*n=2*target 变形为x = (2*target-n*(n+1))/(2*n) 由求和易知,n < target /2 由题干正整数要求知,(n*(n+1))/2 < target, 2*ta 阅读全文
posted @ 2021-02-16 19:49 zjcfrancis 阅读(60) 评论(0) 推荐(0) 编辑
摘要:思路: 1.暴力解法(哈希表) 遍历数组将元素存入哈希表,第二次遍历数组,对每一个元素在哈希表中寻找符合条件的另一个元素。 时间复杂度O(n),空间复杂度O(n) class Solution { public int[] twoSum(int[] nums, int target) { HashS 阅读全文
posted @ 2021-02-16 17:46 zjcfrancis 阅读(42) 评论(0) 推荐(0) 编辑
摘要:思路:双指针 指针A与指针B分别从链表A、B头开始走,走到结尾指向另一个链表头。 当两个指针相遇时,他们指向的节点就是两个链表的第一个公共节点。 原理:小学数学里的相遇问题,二指针在相同时间内走过的距离一样。 假设两个链表的非公共部分长度分别为La,Lb,公共部分长度为C。 相交时A指针走过距离为L 阅读全文
posted @ 2021-02-15 15:05 zjcfrancis 阅读(43) 评论(0) 推荐(0) 编辑
摘要:思路: 1. 暴力解法(字典)。 创建 ’a‘-’z‘ 的字典数组,第一次遍历字符串s,将 s 中字符存储到字典中,统计出现次数。 第二次遍历字符串s,从字典中获取次数,返回结果。 class Solution { public char firstUniqChar(String s) { if ( 阅读全文
posted @ 2021-02-13 02:35 zjcfrancis 阅读(34) 评论(0) 推荐(0) 编辑
摘要:思路:动态规划 dp[i]数组存储以nums[i]结尾的连续子数组最大和。 如果dp[i-1]<0,则dp[i-1]对dp[i]造成负贡献,dp[i]=nums[i]; 如果dp[i-1]≥0,则dp[i-1]对dp[i]造成贡献,dp[i]=dp[i-1]+nums[i]。 如果可以修改原数组,可 阅读全文
posted @ 2021-02-12 19:14 zjcfrancis 阅读(37) 评论(0) 推荐(0) 编辑
摘要:思路: 排序,数组有序后若有满足题意的数字,则其一定在数组的中间位置。 时间复杂度O(nlogn),空间复杂度O(logn) class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return num 阅读全文
posted @ 2021-02-10 02:50 zjcfrancis 阅读(54) 评论(0) 推荐(0) 编辑
摘要:DFS层次遍历,设置层数n,在node中按层数创建该层的数组,dfs时每层加入该层对应数组。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNo 阅读全文
posted @ 2021-02-08 22:04 zjcfrancis 阅读(49) 评论(0) 推荐(0) 编辑
摘要:ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下: import java.util. 阅读全文
posted @ 2021-02-08 21:26 zjcfrancis 阅读(654) 评论(0) 推荐(0) 编辑
摘要:对称的二叉树要求 对于树中 任意两个对称节点 L 和 R ,一定有: L.val = R.val:即此两对称节点值相等。 L.left.val = R.right.val:即 L 的 左子节点 和 R 的 右子节点 对称; L.right.val = R.left.val:即 L 的 右子节点 和 阅读全文
posted @ 2021-02-08 16:21 zjcfrancis 阅读(45) 评论(0) 推荐(0) 编辑
摘要:这道题要求将数组中奇数放前面偶数放后面,不需要排序。 第一时间想到的是额外数组res存结果,遍历原数组奇数存在res前面,偶数存在res后面。 时间复杂度O(n),空间复杂度O(n),好处是没有修改原数组 class Solution { public int[] exchange(int[] nu 阅读全文
posted @ 2021-02-06 15:37 zjcfrancis 阅读(69) 评论(0) 推荐(0) 编辑
摘要:牛客网上做题遇到的问题,以下是网友比较全面的总结: 阅读全文
posted @ 2021-02-03 18:50 zjcfrancis 阅读(112) 评论(0) 推荐(0) 编辑
摘要:这道题表面上是一个简单的数组排序输出最小值的问题,但考虑到旋转数组的部分有序性,可以简化查找最小值的过程。 如我选择从数组末尾开始查找,由于旋转,数组末端旋转后的部分从尾部遍历是递减的,当num[i]<num[i-1]时,找到旋转前数组第一个元素,即最小值。 代码如下: class Solution 阅读全文
posted @ 2021-02-01 02:58 zjcfrancis 阅读(37) 评论(0) 推荐(0) 编辑

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