05 2021 档案
摘要:采用模拟的方案顺时针遍历所有元素 时间O(m*n)(需要遍历所有节点),空间O(1) 1 public List<Integer> spiralOrder(int[][] matrix) { 2 LinkedList<Integer> res = new LinkedList<>(); 3 if(m
阅读全文
摘要:基于s的范围暴力破解的话必然超时 这里采用滑动窗口的方案来处理 我们维护一个队列,依次将字符压入队列,当新遇到的字符 已经在队列中时,我们就需要将队列中已出现的位置前的字符全部弹出 来保证队列中永远不存在重复字符,同时每次队列更新后计算队列长度即可。 时间O(n),空间O(z)(与字符串s的离散度相
阅读全文
摘要:BFS 我们遍历每个节点,每次遇到1得节点,类似扫雷中,将这个节点周围 得所有为1得节点全部置为0(这个步骤我们利用队列实现,不停将该节点周围 得节点压入队列直到维护条件不成立),每次将一个区域得1置为0,最后我们可以 计算出总共有几个搜索块,就是答案了 时间O(m*n)(需要遍历每个节点)空间O(
阅读全文
摘要:三步走方案 第一步:原链表基础上每个节点后新建一个完全一致的辅助节点,例如1->2->3, 调整后为1->1^->2->2^->3->3^ 第二步:将辅助节点的random节点赋值为原节点random的next,比较绕口,这里举个例子 比如原节点1的random节点为3,此时1^的random也是3
阅读全文
摘要:方法一、DP 假设dp[i][j]表示从i到j下标是否是回文串 于是有dp[i][j]=dp[i+1][j-1]^(s[i]==s[j]) 时间O(n^2),空间O(n^2) 1 public String longestPalindrome(String s) { 2 int len = s.le
阅读全文
摘要:比较简单的递推 1 class Solution { 2 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 3 ListNode l3 = new ListNode(),l4=l3; 4 int tag=0; 5 while(l1!=
阅读全文
摘要:方法一、循环取模相加 方法二、对9取模 由于a*100+b*10+c*1=99*a+9*b+a+b+c 所以有(abc)%9=(a+b+c)%9 我们拿题目实例验证 38%9=30%9+8%9=11 11%9=2 于是有 1 class Solution { 2 public int addDigi
阅读全文
摘要:方法一、对于循环除以2,直到结果为奇数,判断结果是否为1 时间O(logn),(这里题目已经给出了n得范围必然是int,那么logn其实必然小于31) 1 class Solution { 2 public boolean isPowerOfTwo(int n) { 3 if(n==0) retur
阅读全文
摘要:这题的难点在于怎么判断查询到的2个节点没有同一个父节点,因此我们每次遍历的 时候,就记录下当前节点的左右子节点,然后对下一层做判断,这样每一层遍历的时候 就能得出下一层的结果 时间O(n),空间O(n) 1 public boolean isCousins(TreeNode root, int x,
阅读全文
摘要:方案一、使用BFS遍历每个元素,遍历时不停检测是否存在2个元素和相加满足要求 时间O(n),空间O(n) 1 public boolean findTarget(TreeNode root, int k) { 2 if(root==null) return false; 3 Set<Integer>
阅读全文
摘要:这里我们采用计算后续n-1位的和,最后直接取反赋值给第0位元素 1 public int[] sumZero(int n) { 2 int[] ans = new int[n]; 3 int sum = 0; 4 for(int i = 1; i < n; i++) { 5 ans[i] = i;
阅读全文
摘要:题目要求s需要是t的子序列,子序列的定义是t中删除一些元素能够与s保持一致。 类似的题目有求2个字符串的最长公共子序列,经典的DP题。 不过本题我们可以偷懒使用双指针来处理,可以把题目简化为 s中的每一个字符是否都能在t中找到对应 时间O(m+n)(m、n分别为字符串s和t的长度),空间O(1) 1
阅读全文
摘要:题目要求替换掉全部的?字符,需要考虑到特殊字符出现在 头尾的边界情况。遍历字符串的所有元素,针对特殊字符,我们获取 当前位置的前后一个元素,然后从a开始递推,得到不与前后元素 相同的第一个元素即可。 1 public String modifyString(String s) { 2 char[]
阅读全文
摘要:方案一、 使用BFS或者DFS遍历每个元素,可直接获得结果 1 public int closestValue(TreeNode root, double target) { 2 int tag=root.val; 3 double res= Math.abs(root.val-target); 4
阅读全文
摘要:拿到题目想到了以前学过的博弈论,这里是比较简化的,对于本题,我们可以把 不同情况下先手的输赢结果列出来看。参考如下分析,我们可以得知, 当 N = 3N=3 的时候,当前做出选择的人可以拿掉最后一块石头,获得胜利;然后我们逐层向上分析,当 N = 4N=4 的时候,无论当前做出哪一种选择,对方都会赢
阅读全文
摘要:双指针+递归来处理 题目要求只删除一个元素,我们可以使用双指针一次比较头尾字符,遇到 不一致的字符做删除操作,这里就出现了2种方案,删除左侧字符还是右侧字符 于是我们递归来处理这2种情况。同时使用全局变量记录删除元素数,当大于1时 即可判定为false 时间O(n),空间O(1)(注意,这里虽然存在
阅读全文
摘要:利用快慢指针来处理 时间O(n),空间O(1) 1 public ListNode middleNode(ListNode head) { 2 if(head==null || head.next==null) return head; 3 ListNode slow=head,fast=head.
阅读全文
摘要:使用DFS求解 时间O(n),空间O(h)(h为整棵树的深度) 1 class Solution { 2 int res=0; 3 public int diameterOfBinaryTree(TreeNode root) { 4 def(root); 5 return res; 6 } 7 8
阅读全文

浙公网安备 33010602011771号