随笔分类 - Java刷题从1开始
摘要:原理:逻辑运算符的短路效应 常见的逻辑运算符有三种,即 “与 && ”,“或 || ”,“非 ! ” ;他们都具备短路效应,如下所示: if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false if(A || B) // 若 A
阅读全文
摘要:思路1: 运用HashSet中元素不重复的性质,计算sumset = sum(set(nums)),与sumnum = sum(nums) (sumset*3 - sumnum)/2即得到结果。 原理: 设所求数字为 x,其他数字和为sumy,则sumset == x+(sumy/3),sumnum
阅读全文
摘要:原理:位运算 如果该整型数组中只有一个数字 x 出现一次,其他数字出现两次。 由于两个相同的数字异或后得0,若将 nums 中所有数字执行异或运算,留下的结果则为出现一次的数字 x。 思路: 题目中有两个数字只出现一次,nums 中所有数字执行异或运算后得到 x⊕y。 由于x≠y,则 x⊕y 二进制
阅读全文
摘要:思路: 递归回溯。 将字符串转为字符数组后,DFS搜索所有排序方案,即一次固定一个字母。 搜索时,通过swap操作来依序固定字母,得到一个排列方案,搜索后通过swap操作复原。 代码: class Solution { Set<String> list = new HashSet<>(); char
阅读全文
摘要:思路:前序遍历 dfs前序遍历二叉树,记录每条路径是否满足和为sum,不满足则删去该结点,回溯到上一个结点。 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode le
阅读全文
摘要:思路: 先序遍历,递归判断。 通过先序遍历,先判断B的根节点是否等于A中的一个节点,再从这个节点开始分别判断左子树和右子树是否相同。 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; *
阅读全文
摘要:思路:DFS 从矩阵第一个元素开始,向左右上下进行DFS递归遍历,即沿一个方向搜到底回溯至上个节点,沿另一个方向搜索,以此类推。 其中当遇到不可能匹配成功的路径(越界,与目标元素不符等)时,可以进行剪枝,即提前返回。 应将已访问过的元素置空,即改为空字符‘ ’,防止之后的搜索中重复访问。 当匹配字符
阅读全文
摘要:说明: -100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。 思路:快速幂 原理: xn暴力解法是循环乘x,时间复杂度O(n),但这是线性复杂度的,会超时。 快速幂的原理则是将幂指数 n 进行分割,从而将其变为对数复杂度的计算。 下面
阅读全文
摘要:同上一篇剪绳子,题目不同点在于 n 的范围变大,当n过大时,乘积结果过大会导致溢出。 因此不能直接使用动态规划求解。 如果在上题中的动态规划中加入大数运算,虽然能得到结果,但效率过低,如下图所示: 如果使用上题中的数学方法解题,能正常得出结果,代码如下: class Solution { publi
阅读全文
摘要:思路: 1.动态规划 首先想到的肯定是暴力解法,将所有情况列举出来再计算,时间复杂度O(2^n),很明显这种做法会超时。 如何改进暴力解法呢?在计算时会发现暴力解法实际上是将求解F(n)的问题分解成求解F(n-1)的问题。 由此可以使用动态规划的解法。 定义一个数组dp,其中 dp[i] 表示的是长
阅读全文
摘要:设节点 root 为节点 p, q 的某公共祖先,若其左子节点 root.left 和右子节点 root.right 都不是 p,q 的公共祖先,则称 root 是 “最近的公共祖先” 。 根据以上定义,若 root 是 p, q 的最近公共祖先 ,则只可能为以下情况之一: p 和 q 在 root
阅读全文
摘要:位运算模拟运算 因为不熟悉,暂时照搬leetcode大佬题解 代码: class Solution { public int add(int a, int b) { while(b != 0) { // 当进位为 0 时跳出 int c = (a & b) << 1; // c = 进位 a ^=
阅读全文
摘要:思路: 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
阅读全文
摘要:思路: 1.暴力解法(哈希表) 遍历数组将元素存入哈希表,第二次遍历数组,对每一个元素在哈希表中寻找符合条件的另一个元素。 时间复杂度O(n),空间复杂度O(n) class Solution { public int[] twoSum(int[] nums, int target) { HashS
阅读全文
摘要:思路:双指针 指针A与指针B分别从链表A、B头开始走,走到结尾指向另一个链表头。 当两个指针相遇时,他们指向的节点就是两个链表的第一个公共节点。 原理:小学数学里的相遇问题,二指针在相同时间内走过的距离一样。 假设两个链表的非公共部分长度分别为La,Lb,公共部分长度为C。 相交时A指针走过距离为L
阅读全文
摘要:思路: 1. 暴力解法(字典)。 创建 ’a‘-’z‘ 的字典数组,第一次遍历字符串s,将 s 中字符存储到字典中,统计出现次数。 第二次遍历字符串s,从字典中获取次数,返回结果。 class Solution { public char firstUniqChar(String s) { if (
阅读全文
摘要:思路:动态规划 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]。 如果可以修改原数组,可
阅读全文
摘要:思路: 排序,数组有序后若有满足题意的数字,则其一定在数组的中间位置。 时间复杂度O(nlogn),空间复杂度O(logn) class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return num
阅读全文
摘要:DFS层次遍历,设置层数n,在node中按层数创建该层的数组,dfs时每层加入该层对应数组。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNo
阅读全文
摘要:对称的二叉树要求 对于树中 任意两个对称节点 L 和 R ,一定有: L.val = R.val:即此两对称节点值相等。 L.left.val = R.right.val:即 L 的 左子节点 和 R 的 右子节点 对称; L.right.val = R.left.val:即 L 的 右子节点 和
阅读全文

浙公网安备 33010602011771号