当前位置:   article > 正文

Java算法:LeetCode算法Java版合集155-509题_java算法leetcode书

java算法leetcode书

155. 最小栈

题目描述

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) -- 将元素 x 推入栈中。
  • pop() -- 删除栈顶的元素。
  • top() -- 获取栈顶元素。
  • getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

解法

Java

class MinStack {
    private Deque<Integer> s;
    private Deque<Integer> helper;
    /** initialize your data structure here. */
    public MinStack() {
        s = new ArrayDeque<>();
        helper = new ArrayDeque<>();
    }
    public void push(int x) {
        s.push(x);
        int element = helper.isEmpty() || x < helper.peek() ? x : helper.peek();
        helper.push(element);
    }
    public void pop() {
        s.pop();
        helper.pop();
    }
    public int top() {
        return s.peek();
    }
    public int getMin() {
        return helper.peek();
    }
}
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

160. 相交链表

题目描述

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表

![\[外链图片转存失败,源](https://img-blog.csdnimg.cn/2021022422170395.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjY1Njcz,size_16,color_FFFFFF,t_70)

在节点 c1 开始相交。

 

示例 1:

在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

 

示例 2:

在这里插入图片描述

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

 

示例 3:

在这里插入图片描述

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
解释:这两个链表不相交,因此返回 null。

 

注意:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

解法

定义两个指针,遍历时,当两个指针到达末尾的节点指向另一个链表的头部继续遍历,最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)。
两个指针等于移动了相同的距离,有交点就返回,无交点就是各走了两条指针的长度。

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        ListNode pA = headA, pB = headB;
        while (pA != pB) {
            pA = pA != null ? pA.next : headB;
            pB = pB != null ? pB.next : headA;
        }
        return pA;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

162. 寻找峰值

题目描述

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

    示例 2:

    输入: nums = [1,2,1,3,5,6,4]
    输出: 1 或 5 
    解释: 你的函数可以返回索引 1,其峰值元素为 2;
         或者返回索引 5, 其峰值元素为 6。
    

      说明:

      你的解法应该是 O(logN) 时间复杂度的。

      解法

      Java

      class Solution {
          public int findPeakElement(int[] nums) {
              int left = 0, right = nums.length - 1;
              while (left < right) {
                  int mid = (left + right) / 2;
                  if(nums[mid] < nums[mid + 1]) left = mid + 1;
                  else right = mid;
              }
              return left;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      164. 最大间距

      题目描述

      给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

      如果数组元素个数小于 2,则返回 0。

      示例 1:

      输入: [3,6,9,1]
      输出: 3
      解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

      示例 2:

      输入: [10]
      输出: 0
      解释: 数组元素个数小于 2,因此返回 0。

      说明:

      • 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
      • 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。

      解法

      Java

      class Solution {
          public int maximumGap(int[] nums) {
              int length = nums.length;
              if(length <2) return 0;
              Arrays.sort(nums);
              int max=0;
              for(int i = 1; i< length; i++) max = Integer.max(nums[i] - nums[i - 1], max);
              return max;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      165. 比较版本号

      题目描述

      比较两个版本号 version1 version2
      如果 version1 version2 返回 1,如果 version1 version2 返回 -1, 除此之外返回 0

      你可以假设版本字符串非空,并且只包含数字和 . 字符。

       . 字符不代表小数点,而是用于分隔数字序列。

      例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

      你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 34。其第三级和第四级修订号均为 0
       

      示例 1:

      输入: version1 = "0.1", version2 = "1.1"
      输出: -1

          示例 2:

          输入: version1 = "1.0.1", version2 = "1"
          输出: 1

              示例 3:

              输入: version1 = "7.5.2.4", version2 = "7.5.3"
              输出: -1

                  示例 4:

                  输入:version1 = "1.01", version2 = "1.001"
                  输出:0
                  解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。

                      示例 5:

                      输入:version1 = "1.0", version2 = "1.0.0"
                      输出:0
                      解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。

                             

                            提示:

                            1. 版本字符串由以点 (.) 分隔的数字字符串组成。这个数字字符串可能有前导零。
                            2. 版本字符串不以点开始或结束,并且其中不会有两个连续的点。

                            解法

                            Java

                            class Solution {
                                public int compareVersion(String version1, String version2) {
                                    if(version1 == null || version2 == null) return 0;
                                    char[] v1 = version1.toCharArray();
                                    char[] v2 = version2.toCharArray();
                                    for (int i = 0,j = 0;i < v1.length || j < v2.length;i++,j++){
                                        int ver1 = 0, ver2 = 0;
                                        for (;i<v1.length && v1[i]!='.';i++) ver1 = ver1 * 10 + v1[i] - '0';
                                        for (;j<v2.length && v2[j]!='.';j++) ver2 = ver2 * 10 + v2[j] - '0';
                                        if(ver1 < ver2) return -1;
                                        else if(ver1 > ver2) return 1;
                                    }
                                    return 0;
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15

                            166. 分数到小数

                            题目描述

                            给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。

                            如果小数部分为循环小数,则将循环的部分括在括号内。

                            示例 1:

                            输入: numerator = 1, denominator = 2
                            输出: "0.5"
                            

                            示例 2:

                            输入: numerator = 2, denominator = 1
                            输出: "2"

                            示例 3:

                            输入: numerator = 2, denominator = 3
                            输出: "0.(6)"
                            

                            解法

                            Java

                            class Solution {
                                public String fractionToDecimal(int numerator, int denominator) {
                                    boolean minus = numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0;
                                    HashMap<Long, Integer> remains = new HashMap<>(16);
                                    List<Long> resList = new ArrayList<>();
                                    long n;
                                    if(numerator > 0) n = numerator;
                                    else if(numerator > Integer.MIN_VALUE) n = -numerator;
                                    else n = Integer.MAX_VALUE + 1L;
                                    long d;
                                    if(denominator > 0) d = denominator;
                                    else if(denominator > Integer.MIN_VALUE) d = -denominator;
                                    else d = Integer.MAX_VALUE + 1L;
                                    long r = n % d;
                                    int index = 0 , loopPos = -1;
                                    while(r != 0){
                                        if(remains.containsKey(r)){
                                            loopPos = remains.get(r);
                                            break;
                                        }
                                        remains.put(r, ++index);
                                        resList.add(Math.abs(n / d));
                                        n = r;
                                        n *= 10;
                                        r = n % d;
                                    }
                                    resList.add(Math.abs(n / d));
                                    StringBuilder res = new StringBuilder();
                                    if(minus) res.append("-");
                                    for(int i = 0; i < resList.size(); i++){
                                        if(i == 1) res.append(".");
                                        if(loopPos == i) res.append("(");
                                        res.append(resList.get(i));
                                    }
                                    if(loopPos != -1) res.append(")");
                                    return res.toString();
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17
                            • 18
                            • 19
                            • 20
                            • 21
                            • 22
                            • 23
                            • 24
                            • 25
                            • 26
                            • 27
                            • 28
                            • 29
                            • 30
                            • 31
                            • 32
                            • 33
                            • 34
                            • 35
                            • 36
                            • 37
                            • 38

                            167. 两数之和 II - 输入有序数组

                            题目描述

                            给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

                            函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2

                            说明:

                            • 返回的下标值(index1 和 index2)不是从零开始的。
                            • 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

                            示例:

                            输入: numbers = [2, 7, 11, 15], target = 9
                            输出: [1,2]
                            解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

                            解法

                            Java

                            class Solution {
                                public int[] twoSum(int[] numbers, int target) {
                                    int l = 0, r = numbers.length - 1;
                                    while(numbers[l]+numbers[r] != target) {
                                        while(numbers[l] + numbers[r] > target) r --;
                                        while(numbers[l] + numbers[r] < target) l ++;
                                    }
                                    return new int[] {l + 1, r + 1};
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10

                            168. Excel 表列名称

                            题目描述

                            给定一个正整数,返回它在 Excel 表中相对应的列名称。

                            例如,

                                1 -> A
                                2 -> B
                                3 -> C
                                ...
                                26 -> Z
                                27 -> AA
                                28 -> AB 
                                ...
                            

                            示例 1:

                            输入: 1
                            输出: "A"
                            

                            示例 2:

                            输入: 28
                            输出: "AB"
                            

                            示例 3:

                            输入: 701
                            输出: "ZY"
                            

                            解法

                            Java

                            class Solution {
                                public String convertToTitle(int n) {
                                    if (n < 0) {
                                        return "";
                                    }        
                                    StringBuilder sb = new StringBuilder();
                                    while (n > 0) {
                                        n--;
                                        int temp = n % 26;
                                        sb.insert(0,(char)(temp + 'A'));
                                        n /= 26;
                                    }
                                    return sb.toString();
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15

                            169. 多数元素

                            题目描述

                            给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

                            你可以假设数组是非空的,并且给定的数组总是存在多数元素。

                            示例 1:

                            输入: [3,2,3]
                            输出: 3

                            示例 2:

                            输入: [2,2,1,1,1,2,2]
                            输出: 2
                            

                            解法

                            Java

                            class Solution {
                                public int majorityElement(int[] nums) {
                                    int count=1;
                                    int res=nums[0];
                                    for(int i=1; i<nums.length; i++){
                                        if(res==nums[i])
                                            count++;
                                        else{
                                            count--;
                                            if(count==0)
                                                res=nums[i+1];
                                        }
                                    }
                                    return res;
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16

                            171. Excel 表列序号

                            题目描述

                            给定一个Excel表格中的列名称,返回其相应的列序号。

                            例如,

                                A -> 1
                                B -> 2
                                C -> 3
                                ...
                                Z -> 26
                                AA -> 27
                                AB -> 28 
                                ...
                            

                            示例 1:

                            输入: "A"
                            输出: 1
                            

                            示例 2:

                            输入: "AB"
                            输出: 28
                            

                            示例 3:

                            输入: "ZY"
                            输出: 701

                            致谢:
                            特别感谢 @ts 添加此问题并创建所有测试用例。

                            解法

                            Java

                            class Solution {
                                public int titleToNumber(String s) {
                                    char[] cs = s.toCharArray();
                                    int n = 0;
                                    int p = 1;
                                    for (int i = cs.length-1; i >= 0; i--) {
                                        n += (cs[i]-'A'+1)*p;
                                        p *= 26;
                                    }
                                    return n;
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12

                            172. 阶乘后的零

                            题目描述

                            给定一个整数 n,返回 n! 结果尾数中零的数量。

                            示例 1:

                            输入: 3
                            输出: 0
                            解释: 3! = 6, 尾数中没有零。

                            示例 2:

                            输入: 5
                            输出: 1
                            解释: 5! = 120, 尾数中有 1 个零.

                            说明: 你算法的时间复杂度应为 O(log n) 

                            解法

                            Java

                            class Solution {
                                public int trailingZeroes(int n) {
                                    int t = 0;
                                    while (n >= 5) {
                                        t += n / 5;
                                        n /= 5;
                                    }
                                    return t;
                                }
                            }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10

                            173. 二叉搜索树迭代器

                            题目描述

                            实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。

                            调用 next() 将返回二叉搜索树中的下一个最小的数。

                             

                            示例:

                            在这里插入图片描述

                            BSTIterator iterator = new BSTIterator(root);
                            iterator.next();    // 返回 3
                            iterator.next();    // 返回 7
                            iterator.hasNext(); // 返回 true
                            iterator.next();    // 返回 9
                            iterator.hasNext(); // 返回 true
                            iterator.next();    // 返回 15
                            iterator.hasNext(); // 返回 true
                            iterator.next();    // 返回 20
                            iterator.hasNext(); // 返回 false

                             

                            提示:

                            • next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 是树的高度。
                            • 你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。

                            解法

                            Java

                            /**
                             * Definition for a binary tree node.
                             * public class TreeNode {
                             *     int val;
                             *     TreeNode left;
                             *     TreeNode right;
                             *     TreeNode(int x) { val = x; }
                             * }
                             */
                            class BSTIterator {
                                Stack<TreeNode> vector = new Stack<>();
                                TreeNode current;
                                public BSTIterator(TreeNode root) {
                                    current = root;
                                    // 一直放入左儿子(左)
                                    while (current != null) {
                                        vector.push(current);
                                        current = current.left;
                                    }
                                }
                                /** @return whether we have a next smallest number */
                                public boolean hasNext() {
                                    return !vector.isEmpty() || current != null;
                                }
                                /** @return the next smallest number */
                                public int next() {
                                    // 一直放入左儿子(左)
                                    while (current != null) {
                                        vector.push(current);
                                        current = current.left;
                                    }
                                    int ans = 0;
                                    // 访问当前元素(中),把右儿子入栈(右)
                                    if (!vector.isEmpty()) {
                                        current = vector.pop();
                                        ans = current.val;
                                        current = current.right;
                                    }
                                    return ans;
                                }
                            }
                            /**
                             * Your BSTIterator object will be instantiated and called as such:
                             * BSTIterator obj = new BSTIterator(root);
                             * int param_1 = obj.next();
                             * boolean param_2 = obj.hasNext();
                             */
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17
                            • 18
                            • 19
                            • 20
                            • 21
                            • 22
                            • 23
                            • 24
                            • 25
                            • 26
                            • 27
                            • 28
                            • 29
                            • 30
                            • 31
                            • 32
                            • 33
                            • 34
                            • 35
                            • 36
                            • 37
                            • 38
                            • 39
                            • 40
                            • 41
                            • 42
                            • 43
                            • 44
                            • 45
                            • 46
                            • 47

                            174. 地下城游戏

                            题目描述

                            一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

                            骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

                            有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

                            为了尽快到达公主,骑士决定每次只向右或向下移动一步。

                             

                            编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

                            例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7

                            -2 (K)-33
                            -5-101
                            1030-5 (P)

                             

                            说明:

                            • 骑士的健康点数没有上限。

                            • 任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

                            解法

                            Java

                            class Solution {
                                public int calculateMinimumHP(int[][] dungeon) {
                                     int row = dungeon.length, column = dungeon[0].length;
                                     int[][] dp = new int[row + 1][column + 1];
                                     for (int i = 0;i <= row;i++) {
                                         Arrays.fill(dp[i], Integer.MAX_VALUE);
                                     }
                                     dp[row][column - 1] = dp[row - 1][column] = 1;
                                     for (int i = row - 1;i > -1;i--) {
                                         for (int j = column - 1;j > -1;j--) {
                                             int min = Math.min(dp[i][j + 1], dp[i + 1][j]);
                                             dp[i][j] = Math.max(min - dungeon[i][j], 1);
                                         }
                                     }
                                     return dp[0][0];
                                 }
                             }
                            
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17

                            179. 最大数

                            题目描述

                            给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

                            示例 1:

                            输入: [10,2]
                            输出: 210

                                示例 2:

                                输入: [3,30,34,5,9]
                                输出: 9534330

                                    说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。

                                    解法

                                    Java

                                    public class Solution {
                                        public String largestNumber(int[] nums) {
                                    		String[] strs = new String[nums.length];
                                    		for (int i = 0; i < strs.length; i++) {
                                    			strs[i] = nums[i] + "";
                                    		}
                                    		Arrays.sort(strs, new Comparator<String>() {
                                    			public int compare(String x, String y) {
                                    				return (y + x).compareTo(x + y);
                                    			}
                                    		});
                                    		if ("0".equals(strs[0])) {
                                    			return "0";
                                    		}
                                    		return String.join("", strs);
                                    	}
                                    }
                                    
                                    • 1
                                    • 2
                                    • 3
                                    • 4
                                    • 5
                                    • 6
                                    • 7
                                    • 8
                                    • 9
                                    • 10
                                    • 11
                                    • 12
                                    • 13
                                    • 14
                                    • 15
                                    • 16
                                    • 17

                                    187. 重复的 DNA 序列

                                    题目描述

                                    所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。

                                    编写一个函数来查找 DNA 分子中所有出现超过一次的 10 个字母长的序列(子串)。

                                     

                                    示例:

                                    输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
                                    输出:["AAAAACCCCC", "CCCCCAAAAA"]

                                    解法

                                    Java

                                    class Solution {
                                        public List<String> findRepeatedDnaSequences(String s) {
                                            Map<String, Integer> map = new HashMap<>();
                                            for (int i = 10; i <= s.length(); ++i) {
                                                String sub = s.substring(i - 10, i);
                                                map.put(sub, map.getOrDefault(sub, 0) + 1);
                                            }
                                            List<String> res = new ArrayList<>();
                                            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                                                if (entry.getValue() > 1) {
                                                    res.add(entry.getKey());
                                                }
                                            }
                                            return res;
                                        }
                                    }
                                    
                                    • 1
                                    • 2
                                    • 3
                                    • 4
                                    • 5
                                    • 6
                                    • 7
                                    • 8
                                    • 9
                                    • 10
                                    • 11
                                    • 12
                                    • 13
                                    • 14
                                    • 15
                                    • 16

                                    188. 买卖股票的最佳时机 IV

                                    题目描述

                                    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

                                    设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

                                    注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

                                    示例 1:

                                    输入: [2,4,1], k = 2
                                    输出: 2
                                    解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
                                    

                                    示例 2:

                                    输入: [3,2,6,5,0,3], k = 2
                                    输出: 7
                                    解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
                                         随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
                                    

                                    解法

                                    Java

                                    class Solution {
                                        public int maxProfit(int k, int[] prices) {
                                    		if (prices == null || prices.length == 0) {
                                    			return 0;
                                    		}
                                            
                                            if(k >= prices.length) return maxProfit(prices);
                                            
                                    		int n = prices.length;
                                    		int[] l = new int[k + 1];
                                    		int[] g = new int[k + 1];
                                    		for (int i = 1; i < n; i++) {
                                    			int diff = prices[i] - prices[i - 1];
                                    			for (int j = k; j >= 1; j--) {
                                    				l[j] = Math.max(l[j], g[j - 1]) + diff;
                                    				g[j] = Math.max(l[j], g[j]);
                                    			}
                                    		}
                                    		return g[k];
                                        }
                                        
                                        public int maxProfit(int[] prices) {
                                            // 只要有利润就卖,就是最优解。
                                            int profit = 0;
                                            for(int i = 1; i < prices.length; i++) {
                                                if(prices[i] > prices[i - 1]) {
                                                    profit += prices[i] - prices[i - 1];
                                                }
                                            }
                                            return profit;
                                        }
                                    }
                                    
                                    • 1
                                    • 2
                                    • 3
                                    • 4
                                    • 5
                                    • 6
                                    • 7
                                    • 8
                                    • 9
                                    • 10
                                    • 11
                                    • 12
                                    • 13
                                    • 14
                                    • 15
                                    • 16
                                    • 17
                                    • 18
                                    • 19
                                    • 20
                                    • 21
                                    • 22
                                    • 23
                                    • 24
                                    • 25
                                    • 26
                                    • 27
                                    • 28
                                    • 29
                                    • 30
                                    • 31
                                    • 32

                                    189. 旋转数组

                                    题目描述

                                    给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

                                    示例 1:

                                    输入: [1,2,3,4,5,6,7]k = 3
                                    输出: [5,6,7,1,2,3,4]
                                    解释:
                                    向右旋转 1 步: [7,1,2,3,4,5,6]
                                    向右旋转 2 步: [6,7,1,2,3,4,5]
                                    向右旋转 3 步: [5,6,7,1,2,3,4]
                                    
                                          • 1

                                            示例 2:

                                            输入: [-1,-100,3,99]k = 2
                                            输出: [3,99,-1,-100]
                                            解释: 
                                            向右旋转 1 步: [99,-1,-100,3]
                                            向右旋转 2 步: [3,99,-1,-100]

                                              说明:

                                              • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
                                              • 要求使用空间复杂度为 O(1) 的 原地 算法。

                                              解法

                                              k=3nums=[1,2,3,4,5,6,7]
                                              先将 nums 整体翻转:[1,2,3,4,5,6,7] -> [7,6,5,4,3,2,1]
                                              再翻转 0~k-1 范围内的元素:[7,6,5,4,3,2,1] -> [5,6,7,4,3,2,1]
                                              最后翻转 k~n-1 范围内的元素,即可得到最终结果:[5,6,7,4,3,2,1] -> [5,6,7,1,2,3,4]

                                              Java

                                              class Solution {
                                                  public void rotate(int[] nums, int k) {
                                                      if (nums == null) {
                                                          return;
                                                      }
                                                      int n = nums.length;
                                                      k %= n;
                                                      if (n < 2 || k == 0) {
                                                          return;
                                                      }
                                                      rotate(nums, 0, n - 1);
                                                      rotate(nums, 0, k - 1);
                                                      rotate(nums, k, n - 1);
                                                  }
                                                  private void rotate(int[] nums, int i, int j) {
                                                      while (i < j) {
                                                          int t = nums[i];
                                                          nums[i] = nums[j];
                                                          nums[j] = t;
                                                          ++i;
                                                          --j;
                                                      }
                                                  }
                                              }
                                              
                                              • 1
                                              • 2
                                              • 3
                                              • 4
                                              • 5
                                              • 6
                                              • 7
                                              • 8
                                              • 9
                                              • 10
                                              • 11
                                              • 12
                                              • 13
                                              • 14
                                              • 15
                                              • 16
                                              • 17
                                              • 18
                                              • 19
                                              • 20
                                              • 21
                                              • 22
                                              • 23
                                              • 24

                                              190. 颠倒二进制位

                                              题目描述

                                              颠倒给定的 32 位无符号整数的二进制位。

                                               

                                              示例 1:

                                              输入: 00000010100101000001111010011100
                                              输出: 00111001011110000010100101000000
                                              解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596      因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

                                              示例 2:

                                              输入:11111111111111111111111111111101
                                              输出:10111111111111111111111111111111
                                              解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
                                                    因此返回 3221225471 其二进制表示形式为 10101111110010110010011101101001。

                                               

                                              提示:

                                              • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
                                              • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825

                                               

                                              进阶:
                                              如果多次调用这个函数,你将如何优化你的算法?

                                              解法

                                              Java

                                              public class Solution {
                                                  // you need treat n as an unsigned value
                                                  public int reverseBits(int n) {
                                                      int res = 0;
                                                      for (int i = 0; i < 31; i++, n>>=1, res<<=1) {
                                                          res |= (n&1);
                                                      }
                                                      res |= (n&1);
                                                      return res;
                                                  }
                                              }
                                              
                                              • 1
                                              • 2
                                              • 3
                                              • 4
                                              • 5
                                              • 6
                                              • 7
                                              • 8
                                              • 9
                                              • 10
                                              • 11

                                              191. 位 1 的个数

                                              题目描述

                                              编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

                                               

                                              示例 1:

                                              输入:00000000000000000000000000001011
                                              输出:3
                                              解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
                                              

                                                示例 2:

                                                输入:00000000000000000000000010000000
                                                输出:1
                                                解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
                                                

                                                示例 3:

                                                输入:11111111111111111111111111111101
                                                输出:31
                                                解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

                                                 

                                                提示:

                                                • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
                                                • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3

                                                 

                                                进阶:
                                                如果多次调用这个函数,你将如何优化你的算法?

                                                解法

                                                Java

                                                public class Solution {
                                                    public int hammingWeight(int n) {
                                                        return Integer.bitCount(n);
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5

                                                198. 打家劫舍

                                                题目描述

                                                你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

                                                给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

                                                示例 1:

                                                输入: [1,2,3,1]
                                                输出: 4
                                                解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
                                                     偷窃到的最高金额 = 1 + 3 = 4 。

                                                示例 2:

                                                输入: [2,7,9,3,1]
                                                输出: 12
                                                解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
                                                     偷窃到的最高金额 = 2 + 9 + 1 = 12 。
                                                

                                                解法

                                                Java

                                                class Solution {
                                                    public int rob(int[] nums) {
                                                        int n;
                                                        if (nums == null || (n = nums.length) == 0) {
                                                            return 0;
                                                        }
                                                        if (n == 1) {
                                                            return nums[0];
                                                        }
                                                        int pre = nums[0];
                                                        int cur = Math.max(nums[0], nums[1]);
                                                        for (int i = 2; i < n; ++i) {
                                                            int t = Math.max(pre + nums[i], cur);
                                                            pre = cur;
                                                            cur = t;
                                                        }
                                                        return cur;
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18
                                                • 19

                                                199. 二叉树的右视图

                                                题目描述

                                                给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

                                                示例:

                                                输入: [1,2,3,null,5,null,4]
                                                输出: [1, 3, 4]
                                                解释:
                                                
                                                   1            <---
                                                 /   \
                                                2     3         <---
                                                 \     \
                                                  5     4       <---
                                                

                                                解法

                                                Java

                                                class Solution {
                                                    public List<Integer> rightSideView(TreeNode root) {
                                                        List<Integer> ans = new ArrayList<>();
                                                        robot(root, ans, 0);
                                                        return ans;
                                                    }
                                                    private void robot(TreeNode root, List<Integer> ans, int level) {
                                                        if (root == null) {
                                                            return;
                                                        }
                                                        if (ans.size() <= level) {
                                                            ans.add(root.val);
                                                        }
                                                        ans.set(level, root.val);
                                                        robot(root.left, ans, level + 1);
                                                        robot(root.right, ans, level + 1);
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18

                                                200. 岛屿数量

                                                题目描述

                                                给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

                                                示例 1:

                                                输入:
                                                11110
                                                11010
                                                11000
                                                00000
                                                输出: 1
                                                

                                                示例 2:

                                                输入:
                                                11000
                                                11000
                                                00100
                                                00011
                                                输出: 3
                                                

                                                解法

                                                Java

                                                class Solution {
                                                    public int numIslands(char[][] grid) {
                                                        int islandNum = 0;
                                                        for (int i = 0; i < grid.length; i++) {
                                                            for (int j = 0; j < grid[0].length; j++) {
                                                                if (grid[i][j] == '1') {
                                                                    infect(grid, i, j);
                                                                    islandNum ++;
                                                                }
                                                            }
                                                        }
                                                        return islandNum;
                                                    }
                                                    public void infect(char[][] grid, int i, int j) {
                                                        if (i < 0 || i >= grid.length ||
                                                                j < 0 || j >= grid[0].length ||
                                                                grid[i][j] != '1') {
                                                            return;
                                                        }
                                                        grid[i][j] = '2';
                                                        infect(grid, i + 1, j);
                                                        infect(grid, i - 1, j);
                                                        infect(grid, i, j + 1);
                                                        infect(grid, i, j - 1);
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18
                                                • 19
                                                • 20
                                                • 21
                                                • 22
                                                • 23
                                                • 24
                                                • 25
                                                • 26

                                                201. 数字范围按位与

                                                题目描述

                                                给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

                                                示例 1: 

                                                输入: [5,7]
                                                输出: 4

                                                示例 2:

                                                输入: [0,1]
                                                输出: 0

                                                解法

                                                Java

                                                class Solution {
                                                    public int rangeBitwiseAnd(int m, int n) {
                                                        while (m < n) {
                                                            n &= n - 1;
                                                        }
                                                        return n;
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8

                                                202. 快乐数

                                                题目描述

                                                编写一个算法来判断一个数是不是“快乐数”。

                                                一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

                                                示例: 

                                                输入: 19
                                                输出: true
                                                解释: 
                                                12 + 92 = 82
                                                82 + 22 = 68
                                                62 + 82 = 100
                                                12 + 02 + 02 = 1
                                                

                                                解法

                                                Java

                                                class Solution {
                                                    public boolean isHappy(int n) {
                                                        Set<Integer> visited = new HashSet<>();
                                                        while (n != 1 && !visited.contains(n)) {
                                                            visited.add(n);
                                                            n = getNext(n);
                                                        }
                                                        return n == 1;
                                                    }
                                                    private int getNext(int n) {
                                                        int s = 0;
                                                        while (n > 0) {
                                                            int digit = n % 10;
                                                            s += digit * digit;
                                                            n /= 10;
                                                        }
                                                        return s;
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18
                                                • 19

                                                203. 移除链表元素

                                                题目描述

                                                删除链表中等于给定值 val 的所有节点。

                                                示例:

                                                输入: 1->2->6->3->4->5->6, val = 6
                                                输出: 1->2->3->4->5
                                                

                                                解法

                                                Java

                                                /**
                                                 * Definition for singly-linked list.
                                                 * public class ListNode {
                                                 *     int val;
                                                 *     ListNode next;
                                                 *     ListNode() {}
                                                 *     ListNode(int val) { this.val = val; }
                                                 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
                                                 * }
                                                 */
                                                class Solution {
                                                    public ListNode removeElements(ListNode head, int val) {
                                                        ListNode dummy = new ListNode(-1, head);
                                                        ListNode pre = dummy;
                                                        while (pre != null && pre.next != null) {
                                                            if (pre.next.val != val) pre = pre.next;
                                                            else pre.next = pre.next.next;
                                                        }
                                                        return dummy.next;
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18
                                                • 19
                                                • 20
                                                • 21

                                                204. 计数质数

                                                题目描述

                                                统计所有小于非负整数 的质数的数量。

                                                示例:

                                                输入: 10
                                                输出: 4
                                                解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
                                                

                                                解法

                                                如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数,因此我们可以从这里入手。
                                                我们设 primes[i] 表示数 i 是不是质数,如果是质数则为 true,否则为 false。从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),即 false,这样在运行结束的时候我们即能知道质数的个数。
                                                对于一个质数 x,我们从 2x 开始标记其实是冗余的,应该直接从 x⋅x 开始标记,因为 2x,3x,… 这些数一定在 x 之前就被其他数的倍数标记过了,例如 2 的所有倍数,3 的所有倍数等。

                                                Java

                                                class Solution {
                                                    public int countPrimes(int n) {
                                                        if (n < 2) return 0;
                                                        boolean[] primes = new boolean[n];
                                                        Arrays.fill(primes, true);
                                                        int res = 0;
                                                        for (int i = 2; i < n; ++i) {
                                                            if (primes[i]) {
                                                                ++res;
                                                                if ((long) i * i < n) {
                                                                    for (int j = i * i; j < n; j += i) {
                                                                        primes[j] = false;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        return res;
                                                    }
                                                }
                                                
                                                • 1
                                                • 2
                                                • 3
                                                • 4
                                                • 5
                                                • 6
                                                • 7
                                                • 8
                                                • 9
                                                • 10
                                                • 11
                                                • 12
                                                • 13
                                                • 14
                                                • 15
                                                • 16
                                                • 17
                                                • 18
                                                • 19

                                                205. 同构字符串

                                                题目描述

                                                给定两个字符串 和 t,判断它们是否是同构的。

                                                如果 中的字符可以被替换得到 ,那么这两个字符串是同构的。

                                                所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

                                                示例 1:

                                                输入: s = "egg", t = "add"
                                                输出: true
                                                

                                                    示例 2:

                                                    输入: s = "foo", t = "bar"
                                                    输出: false

                                                        示例 3:

                                                        输入: s = "paper", t = "title"
                                                        输出: true

                                                            说明:
                                                            你可以假设 t 具有相同的长度。

                                                            解法

                                                            Java

                                                            class Solution {
                                                                public boolean isIsomorphic(String s, String t) {
                                                                    int n = s.length();
                                                                    Map<Character, Character> a2b = new HashMap<>();
                                                                    Map<Character, Character> b2a = new HashMap<>();
                                                                    for (int i = 0; i < n; ++i) {
                                                                        char a = s.charAt(i), b = t.charAt(i);
                                                                        if ((a2b.containsKey(a) && a2b.get(a) != b) || (b2a.containsKey(b) && b2a.get(b) != a)) return false;
                                                                        a2b.put(a, b);
                                                                        b2a.put(b, a);
                                                                    }
                                                                    return true;
                                                                }
                                                            }
                                                            
                                                            • 1
                                                            • 2
                                                            • 3
                                                            • 4
                                                            • 5
                                                            • 6
                                                            • 7
                                                            • 8
                                                            • 9
                                                            • 10
                                                            • 11
                                                            • 12
                                                            • 13
                                                            • 14

                                                            206. 反转链表

                                                            题目描述

                                                            反转一个单链表。

                                                            示例:

                                                            输入: 1->2->3->4->5->NULL
                                                            输出: 5->4->3->2->1->NULL

                                                            进阶:
                                                            你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

                                                            解法

                                                            定义指针 pq 分别指向头节点和下一个节点,pre 指向头节点的前一个节点。
                                                            遍历链表,改变指针 p 指向的节点的指向,将其指向 pre 指针指向的节点,即 p.next = pre。然后 pre 指针指向 ppq 指针往前走。
                                                            当遍历结束后,返回 pre 指针即可。

                                                            Java

                                                            迭代版本:

                                                            /**
                                                             * Definition for singly-linked list.
                                                             * public class ListNode {
                                                             *     int val;
                                                             *     ListNode next;
                                                             *     ListNode(int x) { val = x; }
                                                             * }
                                                             */
                                                            class Solution {
                                                                public ListNode reverseList(ListNode head) {
                                                                    ListNode pre = null, p = head;
                                                                    while (p != null) {
                                                                        ListNode q = p.next;
                                                                        p.next = pre;
                                                                        pre = p;
                                                                        p = q;
                                                                    }
                                                                    return pre;
                                                                }
                                                            }
                                                            
                                                            • 1
                                                            • 2
                                                            • 3
                                                            • 4
                                                            • 5
                                                            • 6
                                                            • 7
                                                            • 8
                                                            • 9
                                                            • 10
                                                            • 11
                                                            • 12
                                                            • 13
                                                            • 14
                                                            • 15
                                                            • 16
                                                            • 17
                                                            • 18
                                                            • 19
                                                            • 20

                                                            递归版本:

                                                            /**
                                                             * Definition for singly-linked list.
                                                             * public class ListNode {
                                                             *     int val;
                                                             *     ListNode next;
                                                             *     ListNode(int x) { val = x; }
                                                             * }
                                                             */
                                                            class Solution {
                                                                public ListNode reverseList(ListNode head) {
                                                                    if (head == null || head.next == null) {
                                                                        return head;
                                                                    }
                                                                    ListNode res = reverseList(head.next);
                                                                    head.next.next = head;
                                                                    head.next = null;
                                                                    return res;
                                                                }
                                                            }
                                                            
                                                            • 1
                                                            • 2
                                                            • 3
                                                            • 4
                                                            • 5
                                                            • 6
                                                            • 7
                                                            • 8
                                                            • 9
                                                            • 10
                                                            • 11
                                                            • 12
                                                            • 13
                                                            • 14
                                                            • 15
                                                            • 16
                                                            • 17
                                                            • 18
                                                            • 19

                                                            207. 课程表

                                                            题目描述

                                                            你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1

                                                            在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

                                                            给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

                                                             

                                                            示例 1:

                                                            输入: 2, [[1,0]] 
                                                            输出: true
                                                            解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

                                                            示例 2:

                                                            输入: 2, [[1,0],[0,1]]
                                                            输出: false
                                                            解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

                                                             

                                                            提示:

                                                            1. 输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法
                                                            2. 你可以假定输入的先决条件中没有重复的边。
                                                            3. 1 <= numCourses <= 10^5

                                                            解法

                                                            Java

                                                            class Solution {
                                                                public boolean canFinish(int numCourses, int[][] prerequisites) {
                                                                    int[] indegree = new int[numCourses];
                                                                    int[][] g = new int[numCourses][numCourses];
                                                                    for (int[] e : prerequisites) {
                                                                        int cur = e[0];
                                                                        int pre = e[1];
                                                                        if (g[pre][cur] == 0) {
                                                                            ++indegree[cur];
                                                                            g[pre][cur] = 1;
                                                                        }
                                                                    }
                                                                    Queue<Integer> queue = new LinkedList<>();
                                                                    for (int i = 0; i < numCourses; ++i) {
                                                                        if (indegree[i] == 0) {
                                                                            queue.offer(i);
                                                                        }
                                                                    }
                                                                    int cnt = 0;
                                                                    while (!queue.isEmpty()) {
                                                                        int i = queue.poll();
                                                                        ++cnt;
                                                                        for (int j = 0; j < numCourses; ++j) {
                                                                            if (g[i][j] == 1) {
                                                                                g[i][j] = 0;
                                                                                --indegree[j];
                                                                                if (indegree[j] == 0) {
                                                                                    queue.offer(j);
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                    return cnt == numCourses;
                                                                }
                                                            }
                                                            
                                                            • 1
                                                            • 2
                                                            • 3
                                                            • 4
                                                            • 5
                                                            • 6
                                                            • 7
                                                            • 8
                                                            • 9
                                                            • 10
                                                            • 11
                                                            • 12
                                                            • 13
                                                            • 14
                                                            • 15
                                                            • 16
                                                            • 17
                                                            • 18
                                                            • 19
                                                            • 20
                                                            • 21
                                                            • 22
                                                            • 23
                                                            • 24
                                                            • 25
                                                            • 26
                                                            • 27
                                                            • 28
                                                            • 29
                                                            • 30
                                                            • 31
                                                            • 32
                                                            • 33
                                                            • 34
                                                            • 35

                                                            208. 实现 Trie (前缀树)

                                                            题目描述

                                                            实现一个 Trie (前缀树),包含 insertsearch, 和 startsWith 这三个操作。

                                                            示例:

                                                            Trie trie = new Trie();
                                                            trie.insert("apple");
                                                            trie.search("apple");   // 返回 true
                                                            trie.search("app");     // 返回 false
                                                            trie.startsWith("app"); // 返回 true
                                                            trie.insert("app");   
                                                            trie.search("app");     // 返回 true

                                                            说明:

                                                            • 你可以假设所有的输入都是由小写字母 a-z 构成的。
                                                            • 保证所有输入均为非空字符串。

                                                            解法

                                                            Java

                                                            class Trie {
                                                                class TrieNode {
                                                                    private TrieNode[] links;
                                                                    private final int R = 26;
                                                                    private boolean isEnd;
                                                                    public TrieNode() {
                                                                        links = new TrieNode[R];
                                                                    }
                                                                    public boolean containsKey(char ch) {
                                                                        return links[ch -'a'] != null;
                                                                    }
                                                                    public TrieNode get(char ch) {
                                                                        return links[ch -'a'];
                                                                    }
                                                                    public void put(char ch, TrieNode node) {
                                                                        links[ch -'a'] = node;
                                                                    }
                                                                    public void setEnd() {
                                                                        isEnd = true;
                                                                    }
                                                                    public boolean isEnd() {
                                                                        return isEnd;
                                                                    }
                                                                }
                                                                private TrieNode root;
                                                                public Trie() {
                                                                    root = new TrieNode();
                                                                }
                                                                public void insert(String word) {
                                                                    TrieNode node = root;
                                                                    for (int i = 0; i < word.length(); i++) {
                                                                        char currentChar = word.charAt(i);
                                                                        if (!node.containsKey(currentChar)) {
                                                                            node.put(currentChar, new TrieNode());
                                                                        }
                                                                        node = node.get(currentChar);
                                                                    }
                                                                    node.setEnd();
                                                                }
                                                                private TrieNode searchPrefix(String word) {
                                                                    TrieNode node = root;
                                                                    for (int i = 0; i < word.length(); i++) {
                                                                        char curLetter = word.charAt(i);
                                                                        if (node.containsKey(curLetter)) {
                                                                            node = node.get(curLetter);
                                                                        } else {
                                                                            return null;
                                                                        }
                                                                    }
                                                                    return node;
                                                                }
                                                                public boolean search(String word) {
                                                                    TrieNode node = searchPrefix(word);
                                                                    return node != null && node.isEnd();
                                                                }
                                                                public boolean startsWith(String prefix) {
                                                                    TrieNode node = searchPrefix(prefix);
                                                                    return node != null;
                                                                }
                                                            }
                                                            
                                                            • 1
                                                            • 2
                                                            • 3
                                                            • 4
                                                            • 5
                                                            • 6
                                                            • 7
                                                            • 8
                                                            • 9
                                                            • 10
                                                            • 11
                                                            • 12
                                                            • 13
                                                            • 14
                                                            • 15
                                                            • 16
                                                            • 17
                                                            • 18
                                                            • 19
                                                            • 20
                                                            • 21
                                                            • 22
                                                            • 23
                                                            • 24
                                                            • 25
                                                            • 26
                                                            • 27
                                                            • 28
                                                            • 29
                                                            • 30
                                                            • 31
                                                            • 32
                                                            • 33
                                                            • 34
                                                            • 35
                                                            • 36
                                                            • 37
                                                            • 38
                                                            • 39
                                                            • 40
                                                            • 41
                                                            • 42
                                                            • 43
                                                            • 44
                                                            • 45
                                                            • 46
                                                            • 47
                                                            • 48
                                                            • 49
                                                            • 50
                                                            • 51
                                                            • 52
                                                            • 53
                                                            • 54
                                                            • 55
                                                            • 56
                                                            • 57
                                                            • 58
                                                            • 59
                                                            • 60

                                                            209. 长度最小的子数组

                                                            题目描述

                                                            给定一个含有 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组如果不存在符合条件的连续子数组,返回 0。

                                                            示例: 

                                                            输入: s = 7, nums = [2,3,1,2,4,3]
                                                            输出: 2
                                                            解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
                                                            

                                                                进阶:

                                                                如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

                                                                解法

                                                                Java

                                                                class Solution {
                                                                    public int minSubArrayLen(int s, int[] nums) {
                                                                        int n = nums.length;
                                                                        int ans = Integer.MAX_VALUE;
                                                                        int start = 0, end = 0;
                                                                        int sum = 0;
                                                                        while (start < n) {
                                                                            while (end < n && sum < s) {
                                                                                sum += nums[end];
                                                                                end++;
                                                                            }
                                                                            if (sum >= s) {
                                                                                ans = Math.min(ans, end - start);
                                                                            }
                                                                            sum -= nums[start];
                                                                            start++;
                                                                        }
                                                                        return ans == Integer.MAX_VALUE ? 0 : ans;
                                                                    }
                                                                }
                                                                
                                                                • 1
                                                                • 2
                                                                • 3
                                                                • 4
                                                                • 5
                                                                • 6
                                                                • 7
                                                                • 8
                                                                • 9
                                                                • 10
                                                                • 11
                                                                • 12
                                                                • 13
                                                                • 14
                                                                • 15
                                                                • 16
                                                                • 17
                                                                • 18
                                                                • 19
                                                                • 20

                                                                210. 课程表 II

                                                                题目描述

                                                                现在你总共有 n 门课需要选,记为 0 到 n-1

                                                                在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

                                                                给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。

                                                                可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。

                                                                示例 1:

                                                                输入: 2, [[1,0]] 
                                                                输出: [0,1]
                                                                解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。

                                                                    示例 2:

                                                                    输入: 4, [[1,0],[2,0],[3,1],[3,2]]
                                                                    输出: [0,1,2,3] or [0,2,1,3]
                                                                    解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
                                                                         因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3]

                                                                          说明:

                                                                          1. 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法
                                                                          2. 你可以假定输入的先决条件中没有重复的边。

                                                                          提示:

                                                                          1. 这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。
                                                                          2. 通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。
                                                                          3. 拓扑排序也可以通过 BFS 完成。

                                                                          解法

                                                                          Java

                                                                          class Solution {
                                                                              public int[] findOrder(int numCourses, int[][] pre) {
                                                                              	// key 课程id,value 前置课程id
                                                                          		Map<Integer, Set<Integer>> map = new HashMap<>();
                                                                          		for (int i = 0; i < pre.length; i++) {
                                                                          			if (map.containsKey(pre[i][0])) {
                                                                          				map.get(pre[i][0]).add(pre[i][1]);
                                                                          			} else {
                                                                          				Set<Integer> set = new HashSet<>();
                                                                          				set.add(pre[i][1]);
                                                                          				map.put(pre[i][0], set);
                                                                          			}
                                                                          		}
                                                                          		int[] visit = new int[numCourses];
                                                                          		List<Integer> ans = new ArrayList<>();
                                                                          		for (int i = 0; i < numCourses; i++) {
                                                                          			if (!dfs(i, visit, map, ans)) {
                                                                          				return new int[0];
                                                                          			}
                                                                          		}
                                                                          		
                                                                          		int[] result = new int[numCourses];
                                                                          		for(int i = 0; i < numCourses; i++){
                                                                                      result[i] = ans.get(i);
                                                                                  }
                                                                          		
                                                                          		return result;
                                                                              }
                                                                          	private boolean dfs(int i, int[] visit, Map<Integer, Set<Integer>> map, List<Integer> ans) {
                                                                          		if (visit[i] == -1) {
                                                                          			return false;
                                                                          		}
                                                                          		if (visit[i] == 1) {
                                                                          			return true;
                                                                          		}
                                                                          		visit[i] = -1;
                                                                          		if (map.containsKey(i)) {
                                                                          			for (int pre : map.get(i)) {
                                                                          				if (!dfs(pre, visit, map,ans)) {
                                                                          					return false;
                                                                          				}
                                                                          			}
                                                                          		}
                                                                          		visit[i] = 1;
                                                                          		ans.add(i);
                                                                          		return true;
                                                                          	}
                                                                          }
                                                                          
                                                                          • 1
                                                                          • 2
                                                                          • 3
                                                                          • 4
                                                                          • 5
                                                                          • 6
                                                                          • 7
                                                                          • 8
                                                                          • 9
                                                                          • 10
                                                                          • 11
                                                                          • 12
                                                                          • 13
                                                                          • 14
                                                                          • 15
                                                                          • 16
                                                                          • 17
                                                                          • 18
                                                                          • 19
                                                                          • 20
                                                                          • 21
                                                                          • 22
                                                                          • 23
                                                                          • 24
                                                                          • 25
                                                                          • 26
                                                                          • 27
                                                                          • 28
                                                                          • 29
                                                                          • 30
                                                                          • 31
                                                                          • 32
                                                                          • 33
                                                                          • 34
                                                                          • 35
                                                                          • 36
                                                                          • 37
                                                                          • 38
                                                                          • 39
                                                                          • 40
                                                                          • 41
                                                                          • 42
                                                                          • 43
                                                                          • 44
                                                                          • 45
                                                                          • 46
                                                                          • 47
                                                                          • 48

                                                                          211. 添加与搜索单词 - 数据结构设计

                                                                          题目描述

                                                                          如果数据结构中有任何与word匹配的字符串,则bool search(word)返回true,否则返回false。 单词可能包含点“。” 点可以与任何字母匹配的地方。

                                                                          请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

                                                                          实现词典类 WordDictionary

                                                                          • WordDictionary() 初始化词典对象
                                                                          • void addWord(word)word 添加到数据结构中,之后可以对它进行匹配
                                                                          • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回  falseword 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。

                                                                           

                                                                          示例:

                                                                          输入:
                                                                          ["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
                                                                          [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
                                                                          输出:
                                                                          [null,null,null,null,false,true,true,true]
                                                                          解释:
                                                                          WordDictionary wordDictionary = new WordDictionary();
                                                                          wordDictionary.addWord("bad");
                                                                          wordDictionary.addWord("dad");
                                                                          wordDictionary.addWord("mad");
                                                                          wordDictionary.search("pad"); // return False
                                                                          wordDictionary.search("bad"); // return True
                                                                          wordDictionary.search(".ad"); // return True
                                                                          wordDictionary.search("b.."); // return True
                                                                          

                                                                           

                                                                          提示:

                                                                          • 1 <= word.length <= 500
                                                                          • addWord 中的 word 由小写英文字母组成
                                                                          • search 中的 word 由 '.' 或小写英文字母组成
                                                                          • 最调用多 50000addWordsearch

                                                                          解法

                                                                          Java

                                                                          class WordDictionary {
                                                                              class TrieNode {
                                                                                  private TrieNode[] links;
                                                                                  private boolean end;
                                                                                  public TrieNode() {
                                                                                      this.links = new TrieNode[26];
                                                                                  }
                                                                                  public boolean contains(char c) {
                                                                                      return links[c - 'a'] != null;
                                                                                  }
                                                                                  public void put(char c, TrieNode trieNode) {
                                                                                      links[c - 'a'] = trieNode;
                                                                                  }
                                                                                  public TrieNode get(char c) {
                                                                                      return links[c - 'a'];
                                                                                  }
                                                                              }
                                                                              private TrieNode root;
                                                                              /** Initialize your data structure here. */
                                                                              public WordDictionary() {
                                                                                  root = new TrieNode();
                                                                              }
                                                                              /** Adds a word into the data structure. */
                                                                              public void addWord(String word) {
                                                                                  TrieNode node = root;
                                                                                  for (int i = 0; i < word.length(); i++) {
                                                                                      char c = word.charAt(i);
                                                                                      if (!node.contains(c)) {
                                                                                          node.put(c, new TrieNode());
                                                                                      }
                                                                                      node = node.get(c);
                                                                                  }
                                                                                  node.end = true;
                                                                              }
                                                                              /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
                                                                              public boolean search(String word) {
                                                                                  return searchHelp(word, root);
                                                                              }
                                                                              private boolean searchHelp(String word, TrieNode root) {
                                                                                  TrieNode node = root;
                                                                                  for (int i = 0; i < word.length(); i++) {
                                                                                      char c = word.charAt(i);
                                                                                      if ('.' == c) {
                                                                                          for (int j = 0; j < node.links.length; j++) {
                                                                                              if (node.links[j] != null && searchHelp(word.substring(i + 1), node.links[j])) {
                                                                                                  return true;
                                                                                              }
                                                                                          }
                                                                                          return false;
                                                                                      }
                                                                                      if (!node.contains(c)) {
                                                                                          return false;
                                                                                      }
                                                                                      node = node.get(c);
                                                                                  }
                                                                                  return node != null && node.end;
                                                                              }
                                                                          }
                                                                          
                                                                          • 1
                                                                          • 2
                                                                          • 3
                                                                          • 4
                                                                          • 5
                                                                          • 6
                                                                          • 7
                                                                          • 8
                                                                          • 9
                                                                          • 10
                                                                          • 11
                                                                          • 12
                                                                          • 13
                                                                          • 14
                                                                          • 15
                                                                          • 16
                                                                          • 17
                                                                          • 18
                                                                          • 19
                                                                          • 20
                                                                          • 21
                                                                          • 22
                                                                          • 23
                                                                          • 24
                                                                          • 25
                                                                          • 26
                                                                          • 27
                                                                          • 28
                                                                          • 29
                                                                          • 30
                                                                          • 31
                                                                          • 32
                                                                          • 33
                                                                          • 34
                                                                          • 35
                                                                          • 36
                                                                          • 37
                                                                          • 38
                                                                          • 39
                                                                          • 40
                                                                          • 41
                                                                          • 42
                                                                          • 43
                                                                          • 44
                                                                          • 45
                                                                          • 46
                                                                          • 47
                                                                          • 48
                                                                          • 49
                                                                          • 50
                                                                          • 51
                                                                          • 52
                                                                          • 53
                                                                          • 54
                                                                          • 55
                                                                          • 56
                                                                          • 57
                                                                          • 58

                                                                          212. 单词搜索 II

                                                                          题目描述

                                                                          给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。

                                                                          单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

                                                                          示例:

                                                                          输入: 
                                                                          words = ["oath","pea","eat","rain"] and board =
                                                                          [
                                                                            ['o','a','a','n'],
                                                                            ['e','t','a','e'],
                                                                            ['i','h','k','r'],
                                                                            ['i','f','l','v']
                                                                          ]
                                                                          输出: ["eat","oath"]

                                                                              说明:
                                                                              你可以假设所有输入都由小写字母 a-z 组成。

                                                                              提示:

                                                                              • 你需要优化回溯算法以通过更大数据量的测试。你能否早点停止回溯?
                                                                              • 如果当前单词不存在于所有单词的前缀中,则可以立即停止回溯。什么样的数据结构可以有效地执行这样的操作?散列表是否可行?为什么? 前缀树如何?如果你想学习如何实现一个基本的前缀树,请先查看这个问题: 实现Trie(前缀树)

                                                                              解法

                                                                              Java

                                                                                213. 打家劫舍 II

                                                                                题目描述

                                                                                你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

                                                                                给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

                                                                                示例 1:

                                                                                输入: [2,3,2]
                                                                                输出: 3
                                                                                解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
                                                                                

                                                                                示例 2:

                                                                                输入: [1,2,3,1]
                                                                                输出: 4
                                                                                解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
                                                                                     偷窃到的最高金额 = 1 + 3 = 4 。

                                                                                解法

                                                                                环状排列意味着第一个房屋和最后一个房屋中最多只能选择一个偷窃,因此可以把此环状排列房间问题约化为两个单排排列房屋子问题。

                                                                                • 不偷第一个房屋(那么最后一个房屋能偷),即求:_rob(nums[1:])
                                                                                • 偷第一个房屋(那么最后一个房屋不能偷),即求:_rob(nums[:-1])
                                                                                  res = max(_rob(nums[1:]), _rob(nums[:-1]))

                                                                                Java

                                                                                class Solution {
                                                                                    public int rob(int[] nums) {
                                                                                        int n = nums.length;
                                                                                        if (n == 1) {
                                                                                            return nums[0];
                                                                                        }
                                                                                        int sub1 = robInternal(Arrays.copyOfRange(nums, 0, n - 1));
                                                                                        int sub2 = robInternal(Arrays.copyOfRange(nums, 1, n));
                                                                                        return Math.max(sub1, sub2);
                                                                                    }
                                                                                    private int robInternal(int[] nums) {
                                                                                        int n;
                                                                                        if ((n = nums.length) == 0) {
                                                                                            return 0;
                                                                                        }
                                                                                        if (n == 1) {
                                                                                            return nums[0];
                                                                                        }
                                                                                        int pre = nums[0];
                                                                                        int cur = Math.max(nums[0], nums[1]);
                                                                                        for (int i = 2; i < n; ++i) {
                                                                                            int t = Math.max(pre + nums[i], cur);
                                                                                            pre = cur;
                                                                                            cur = t;
                                                                                        }
                                                                                        return cur;
                                                                                    }
                                                                                }
                                                                                
                                                                                • 1
                                                                                • 2
                                                                                • 3
                                                                                • 4
                                                                                • 5
                                                                                • 6
                                                                                • 7
                                                                                • 8
                                                                                • 9
                                                                                • 10
                                                                                • 11
                                                                                • 12
                                                                                • 13
                                                                                • 14
                                                                                • 15
                                                                                • 16
                                                                                • 17
                                                                                • 18
                                                                                • 19
                                                                                • 20
                                                                                • 21
                                                                                • 22
                                                                                • 23
                                                                                • 24
                                                                                • 25
                                                                                • 26
                                                                                • 27
                                                                                • 28

                                                                                214. 最短回文串

                                                                                题目描述

                                                                                给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

                                                                                示例 1:

                                                                                输入: "aacecaaa"
                                                                                输出: "aaacecaaa"
                                                                                

                                                                                    示例 2:

                                                                                    输入: "abcd"
                                                                                    输出: "dcbabcd"

                                                                                        解法

                                                                                        Java

                                                                                          215. 数组中的第 K 个最大元素

                                                                                          题目描述

                                                                                          在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

                                                                                          示例 1:

                                                                                          输入: [3,2,1,5,6,4] 和 k = 2
                                                                                          输出: 5
                                                                                          

                                                                                            示例 2:

                                                                                            输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
                                                                                            输出: 4

                                                                                              说明:

                                                                                              你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int findKthLargest(int[] nums, int k) {
                                                                                                      return findKthLargest(nums, 0, nums.length - 1, nums.length - k);
                                                                                                  }
                                                                                                  
                                                                                                  public int findKthLargest(int[] nums, int l, int r, int k) {
                                                                                                      int i = l, j = r;
                                                                                                      int temp = nums[i];
                                                                                                      while (i < j) {
                                                                                                          while (i < j && nums[j] >= temp) {
                                                                                                              j--;
                                                                                                          }
                                                                                                          if (i < j) {
                                                                                                              nums[i++] = nums[j];
                                                                                                          }
                                                                                                          while (i < j && nums[i] <= temp) {
                                                                                                              i++;
                                                                                                          }
                                                                                                          if (i < j) {
                                                                                                              nums[j--] = nums[i];
                                                                                                          }
                                                                                                      }
                                                                                                      nums[i] = temp;
                                                                                                      if (i == k) {
                                                                                                          return nums[i];
                                                                                                      } else if (i < k) {
                                                                                                          return findKthLargest(nums, i + 1, r, k);
                                                                                                      } else {
                                                                                                          return findKthLargest(nums, l, i - 1, k);
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32

                                                                                              216. 组合总和 III

                                                                                              题目描述

                                                                                              找出所有相加之和为 n 的 个数的组合组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

                                                                                              说明:

                                                                                              • 所有数字都是正整数。
                                                                                              • 解集不能包含重复的组合。 

                                                                                              示例 1:

                                                                                              输入: k = 3, n = 7
                                                                                              输出: [[1,2,4]]
                                                                                              

                                                                                              示例 2:

                                                                                              输入: k = 3, n = 9
                                                                                              输出: [[1,2,6], [1,3,5], [2,3,4]]
                                                                                              

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public List<List<Integer>> combinationSum3(int k, int n) {
                                                                                                      List<List<Integer>> ans = new ArrayList<>();        
                                                                                                      robot(1, k, n, ans, new ArrayList<Integer>());
                                                                                                      return ans;
                                                                                                  }
                                                                                                  
                                                                                                  private void robot(int start, int k, int left, List<List<Integer>> ans, List<Integer> tmp) {
                                                                                                      if(k < 0 || left < 0) return;
                                                                                                      
                                                                                                      if(k == 0 && left == 0) {
                                                                                                          ans.add(new ArrayList<>(tmp));
                                                                                                          return;
                                                                                                      }
                                                                                                      
                                                                                                      for(int i = start; i <= 9; i++) {
                                                                                                          if(left >= i && k > 0) {
                                                                                                              tmp.add(i);
                                                                                                              robot(i + 1, k - 1, left - i, ans, tmp);
                                                                                                              tmp.remove(tmp.size() - 1);
                                                                                                          } else {
                                                                                                              return;
                                                                                                          }
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26

                                                                                              217. 存在重复元素

                                                                                              题目描述

                                                                                              给定一个整数数组,判断是否存在重复元素。

                                                                                              如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

                                                                                              示例 1:

                                                                                              输入: [1,2,3,1]
                                                                                              输出: true

                                                                                              示例 2:

                                                                                              输入: [1,2,3,4]
                                                                                              输出: false

                                                                                              示例 3:

                                                                                              输入: [1,1,1,3,3,4,3,2,4,2]
                                                                                              输出: true

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public boolean containsDuplicate(int[] nums) {
                                                                                                      Set<Integer> set = new HashSet<>();
                                                                                                      for (int e : nums) {
                                                                                                          if (set.contains(e)) return true;
                                                                                                          set.add(e);
                                                                                                      }
                                                                                                      return false;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10

                                                                                              219. 存在重复元素 II

                                                                                              题目描述

                                                                                              给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 ij 的差的绝对值最大为 k

                                                                                              示例 1:

                                                                                              输入: nums = [1,2,3,1], k = 3
                                                                                              输出: true

                                                                                              示例 2:

                                                                                              输入: nums = [1,0,1,1], k = 1
                                                                                              输出: true

                                                                                              示例 3:

                                                                                              输入: nums = [1,2,3,1,2,3], k = 2
                                                                                              输出: false

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public boolean containsNearbyDuplicate(int[] nums, int k) {
                                                                                                      Map<Integer, Integer> helper = new HashMap<>();
                                                                                                      for (int i = 0, n = nums.length; i < n; ++i) {
                                                                                                          if (helper.containsKey(nums[i])) {
                                                                                                              int j = helper.get(nums[i]);
                                                                                                              if (i - j <= k) {
                                                                                                                  return true;
                                                                                                              }
                                                                                                          }
                                                                                                          helper.put(nums[i], i);
                                                                                                      }
                                                                                                      return false;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15

                                                                                              220. 存在重复元素 III

                                                                                              题目描述

                                                                                              给定一个整数数组,判断数组中是否有两个不同的索引 ij,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 ij 之间的差的绝对值最大为 ķ

                                                                                              示例 1:

                                                                                              输入: nums = [1,2,3,1], k = 3, t = 0
                                                                                              输出: true

                                                                                              示例 2:

                                                                                              输入: nums = [1,0,1,1], k = 1, t = 2
                                                                                              输出: true

                                                                                              示例 3:

                                                                                              输入: nums = [1,5,9,1,5,9], k = 2, t = 3
                                                                                              输出: false

                                                                                              解法

                                                                                              Java

                                                                                              public class Solution {
                                                                                                  public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
                                                                                              		if (k < 1 || t < 0 || nums == null || nums.length < 2) {
                                                                                              			return false;
                                                                                              		}
                                                                                              		SortedSet<Long> set = new TreeSet<Long>();
                                                                                              		for (int j = 0; j < nums.length; j++) {
                                                                                              			SortedSet<Long> subSet = set.subSet((long) nums[j] - t,
                                                                                              					(long) nums[j] + t + 1);
                                                                                              			if (!subSet.isEmpty()) {
                                                                                              				return true;
                                                                                              			}
                                                                                              			if (j >= k) {
                                                                                              				set.remove((long) nums[j - k]);
                                                                                              			}
                                                                                              			set.add((long) nums[j]);
                                                                                              		}
                                                                                              		return false;
                                                                                              	}
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20

                                                                                              221. 最大正方形

                                                                                              题目描述

                                                                                              在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

                                                                                              示例:

                                                                                              输入: 
                                                                                              
                                                                                              1 0 1 0 0
                                                                                              1 0 1 1 1
                                                                                              1 1 1 1 1
                                                                                              1 0 0 1 0
                                                                                              输出: 4

                                                                                              解法

                                                                                              Java

                                                                                              public class Solution {
                                                                                                  public int maximalSquare(char[][] matrix) {
                                                                                              		if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
                                                                                              			return 0;
                                                                                              		}
                                                                                              		int mx = matrix.length;
                                                                                              		int my = matrix[0].length;
                                                                                              		int[][] dp = new int[mx][my];
                                                                                              		int max = 0;
                                                                                              		// 初始化第0行
                                                                                              		for (int i = 0; i < my; i++) {
                                                                                              			if (matrix[0][i] == '1') {
                                                                                              				dp[0][i] = 1;
                                                                                              				max = 1;
                                                                                              			}
                                                                                              		}
                                                                                              		// 初始化第0列
                                                                                              		for (int i = 1; i < mx; i++) {
                                                                                              			if (matrix[i][0] == '1') {
                                                                                              				dp[i][0] = 1;
                                                                                              				max = 1;
                                                                                              			}
                                                                                              		}
                                                                                              		// dp[x][y]=min(dp[x-1][y],dp[x][y-1],dp[x-1][y-1])+1
                                                                                              		for (int x = 1; x < mx; x++) {
                                                                                              			for (int y = 1; y < my; y++) {
                                                                                              				if (matrix[x][y] == '1') {
                                                                                              					dp[x][y] = Math.min(Math.min(dp[x - 1][y], dp[x][y - 1]),
                                                                                              							dp[x - 1][y - 1]) + 1;
                                                                                              					max = Math.max(max, dp[x][y]);
                                                                                              				}
                                                                                              			}
                                                                                              		}
                                                                                              		return max * max;
                                                                                              	
                                                                                                      
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38

                                                                                              222. 完全二叉树的节点个数

                                                                                              题目描述

                                                                                              给出一个完全二叉树,求出该树的节点个数。

                                                                                              说明:

                                                                                              完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

                                                                                              示例:

                                                                                              输入: 
                                                                                                  1
                                                                                                 / \
                                                                                                2   3
                                                                                               / \  /
                                                                                              4  5 6
                                                                                              输出: 6

                                                                                              解法

                                                                                              Java

                                                                                              /**
                                                                                               * Definition for a binary tree node.
                                                                                               * public class TreeNode {
                                                                                               *     int val;
                                                                                               *     TreeNode left;
                                                                                               *     TreeNode right;
                                                                                               *     TreeNode(int x) { val = x; }
                                                                                               * }
                                                                                               */
                                                                                              class Solution {
                                                                                                  public int countNodes(TreeNode root) {
                                                                                                      if(root == null){
                                                                                                         return 0;
                                                                                                      } 
                                                                                                      int left = countLevel(root.left);
                                                                                                      int right = countLevel(root.right);
                                                                                                      if(left == right){
                                                                                                          return countNodes(root.right) + (1<<left);
                                                                                                      }else{
                                                                                                          return countNodes(root.left) + (1<<right);
                                                                                                      }
                                                                                                  }
                                                                                                  private int countLevel(TreeNode root){
                                                                                                      int level = 0;
                                                                                                      while(root != null){
                                                                                                          level++;
                                                                                                          root = root.left;
                                                                                                      }
                                                                                                      return level;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31

                                                                                              223. 矩形面积

                                                                                              题目描述

                                                                                              二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。

                                                                                              每个矩形由其左下顶点和右上顶点坐标表示,如图所示。

                                                                                              在这里插入图片描述

                                                                                              示例:

                                                                                              输入: -3, 0, 3, 4, 0, -1, 9, 2
                                                                                              输出: 45

                                                                                              说明: 假设矩形面积不会超出 int 的范围。

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
                                                                                                      long x = (long) Math.min(C, G) - Math.max(A, E);
                                                                                                      long y = (long) Math.min(D, H) - Math.max(B, F);
                                                                                                      int intersection = x > 0 && y > 0 ? (int) (x * y) : 0;
                                                                                                      return (C - A) * (D - B) + (G - E) * (H - F) - intersection;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8

                                                                                              224. 基本计算器

                                                                                              题目描述

                                                                                              实现一个基本的计算器来计算一个简单的字符串表达式的值。

                                                                                              字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -非负整数和空格  

                                                                                              示例 1:

                                                                                              输入: "1 + 1"
                                                                                              输出: 2
                                                                                              

                                                                                              示例 2:

                                                                                              输入: " 2-1 + 2 "
                                                                                              输出: 3

                                                                                              示例 3:

                                                                                              输入: "(1+(4+5+2)-3)+(6+8)"
                                                                                              输出: 23

                                                                                              说明:

                                                                                              • 你可以假设所给定的表达式都是有效的。
                                                                                              • 不要使用内置的库函数 eval

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int calculate(String s) {
                                                                                                      char[] cs = s.toCharArray();
                                                                                                      Deque<Character> op = new ArrayDeque<>();
                                                                                                      Deque<Integer> num = new ArrayDeque<>();
                                                                                                      for (int i = 0; i < cs.length; ++i) {
                                                                                                          if (cs[i] == '(' || cs[i] == '+' || cs[i] == '-') {
                                                                                                              op.push(cs[i]);
                                                                                                          } else if (cs[i] == ')') {
                                                                                                              op.pop();
                                                                                                              if (!op.isEmpty() && op.peek() != '(') {
                                                                                                                  calc(op, num);
                                                                                                              }
                                                                                                          } else if (Character.isDigit(cs[i])) {
                                                                                                              int j = i;
                                                                                                              int k = 0;
                                                                                                              while (j < cs.length && Character.isDigit(cs[j])) {
                                                                                                                  k = k * 10 + cs[j] - '0';
                                                                                                                  ++j;
                                                                                                              }
                                                                                                              num.push(k);
                                                                                                              i = j - 1;
                                                                                                              if (!op.isEmpty() && op.peek() != '(') {
                                                                                                                  calc(op, num);
                                                                                                              }
                                                                                                          }
                                                                                                      }
                                                                                                      return num.peek();
                                                                                                  }
                                                                                                  private void calc(Deque<Character> op, Deque<Integer> num) {
                                                                                                      int y = num.pop();
                                                                                                      int x = num.pop();
                                                                                                      if (op.pop() == '+') {
                                                                                                          num.push(x + y);
                                                                                                      } else {
                                                                                                          num.push(x - y);
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38
                                                                                              • 39

                                                                                              225. 用队列实现栈

                                                                                              题目描述

                                                                                              使用队列实现栈的下列操作:

                                                                                              • push(x) -- 元素 x 入栈
                                                                                              • pop() -- 移除栈顶元素
                                                                                              • top() -- 获取栈顶元素
                                                                                              • empty() -- 返回栈是否为空

                                                                                              注意:

                                                                                              • 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
                                                                                              • 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
                                                                                              • 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

                                                                                              解法

                                                                                              Java

                                                                                              class MyStack {
                                                                                                  private Deque<Integer> q;
                                                                                                  /** Initialize your data structure here. */
                                                                                                  public MyStack() {
                                                                                                      q = new ArrayDeque<>();
                                                                                                  }
                                                                                                  /** Push element x onto stack. */
                                                                                                  public void push(int x) {
                                                                                                      q.offerLast(x);
                                                                                                      int n = q.size();
                                                                                                      while (n-- > 1) {
                                                                                                          q.offerLast(q.pollFirst());
                                                                                                      }
                                                                                                  }
                                                                                                  /** Removes the element on top of the stack and returns that element. */
                                                                                                  public int pop() {
                                                                                                      return q.pollFirst();
                                                                                                  }
                                                                                                  /** Get the top element. */
                                                                                                  public int top() {
                                                                                                      return q.peekFirst();
                                                                                                  }
                                                                                                  /** Returns whether the stack is empty. */
                                                                                                  public boolean empty() {
                                                                                                      return q.isEmpty();
                                                                                                  }
                                                                                              }
                                                                                              /**
                                                                                               * Your MyStack object will be instantiated and called as such:
                                                                                               * MyStack obj = new MyStack();
                                                                                               * obj.push(x);
                                                                                               * int param_2 = obj.pop();
                                                                                               * int param_3 = obj.top();
                                                                                               * boolean param_4 = obj.empty();
                                                                                               */
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35

                                                                                              226. 翻转二叉树

                                                                                              题目描述

                                                                                              翻转一棵二叉树。

                                                                                              示例:

                                                                                              输入:

                                                                                                   4
                                                                                                 /   \
                                                                                                2     7
                                                                                               / \   / \
                                                                                              1   3 6   9

                                                                                              输出:

                                                                                                   4
                                                                                                 /   \
                                                                                                7     2
                                                                                               / \   / \
                                                                                              9   6 3   1

                                                                                              备注:
                                                                                              这个问题是受到 Max Howell 原问题 启发的 :

                                                                                              谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

                                                                                              解法

                                                                                              Java

                                                                                              /**
                                                                                               * Definition for a binary tree node.
                                                                                               * public class TreeNode {
                                                                                               *     int val;
                                                                                               *     TreeNode left;
                                                                                               *     TreeNode right;
                                                                                               *     TreeNode(int x) { val = x; }
                                                                                               * }
                                                                                               */
                                                                                              class Solution {
                                                                                                  public TreeNode invertTree(TreeNode root) {
                                                                                                      if (root == null) return null;
                                                                                                      TreeNode t = root.left;
                                                                                                      root.left = root.right;
                                                                                                      root.right = t;
                                                                                                      invertTree(root.left);
                                                                                                      invertTree(root.right);
                                                                                                      return root;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20

                                                                                              227. 基本计算器 II

                                                                                              题目描述

                                                                                              实现一个基本的计算器来计算一个简单的字符串表达式的值。

                                                                                              字符串表达式仅包含非负整数,+-*/ 四种运算符和空格  。 整数除法仅保留整数部分。

                                                                                              示例 1:

                                                                                              输入: "3+2*2"
                                                                                              输出: 7
                                                                                              

                                                                                              示例 2:

                                                                                              输入: " 3/2 "
                                                                                              输出: 1

                                                                                              示例 3:

                                                                                              输入: " 3+5 / 2 "
                                                                                              输出: 5
                                                                                              

                                                                                              说明:

                                                                                              • 你可以假设所给定的表达式都是有效的。
                                                                                              • 不要使用内置的库函数 eval

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int calculate(String s) {
                                                                                                      char[] cs = s.toCharArray();
                                                                                                      Deque<Character> op = new ArrayDeque<>();
                                                                                                      Deque<Integer> num = new ArrayDeque<>();
                                                                                                      for (int i = 0; i < cs.length; ++i) {
                                                                                                          if (cs[i] == '*' || cs[i] == '/') {
                                                                                                              op.push(cs[i]);
                                                                                                          } else if (cs[i] == '+' || cs[i] == '-') {
                                                                                                              if (!op.isEmpty()) {
                                                                                                                  calc(op, num);
                                                                                                              }
                                                                                                              op.push(cs[i]);
                                                                                                          } else if (Character.isDigit(cs[i])) {
                                                                                                              int j = i;
                                                                                                              int k = 0;
                                                                                                              while (j < cs.length && Character.isDigit(cs[j])) {
                                                                                                                  k = k * 10 + cs[j] - '0';
                                                                                                                  ++j;
                                                                                                              }
                                                                                                              i = j - 1;
                                                                                                              num.push(k);
                                                                                                              if (!op.isEmpty() && (op.peek() == '*' || op.peek() == '/')) {
                                                                                                                  calc(op, num);
                                                                                                              }
                                                                                                          }
                                                                                                      }
                                                                                                      if (!op.isEmpty()) {
                                                                                                          calc(op, num);
                                                                                                      }
                                                                                                      return num.peek();
                                                                                                  }
                                                                                                  private void calc(Deque<Character> op, Deque<Integer> num) {
                                                                                                      int y = num.pop();
                                                                                                      int x = num.pop();
                                                                                                      switch (op.pop()) {
                                                                                                          case '*':
                                                                                                              num.push(x * y);
                                                                                                              break;
                                                                                                          case '/':
                                                                                                              num.push(x / y);
                                                                                                              break;
                                                                                                          case '+':
                                                                                                              num.push(x + y);
                                                                                                              break;
                                                                                                          default:
                                                                                                              num.push(x - y);
                                                                                                              break;
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38
                                                                                              • 39
                                                                                              • 40
                                                                                              • 41
                                                                                              • 42
                                                                                              • 43
                                                                                              • 44
                                                                                              • 45
                                                                                              • 46
                                                                                              • 47
                                                                                              • 48
                                                                                              • 49
                                                                                              • 50
                                                                                              • 51

                                                                                              228. 汇总区间

                                                                                              题目描述

                                                                                              给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

                                                                                              示例 1:

                                                                                              输入: [0,1,2,4,5,7]
                                                                                              输出: ["0->2","4->5","7"]
                                                                                              解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。

                                                                                              示例 2:

                                                                                              输入: [0,2,3,4,6,8,9]
                                                                                              输出: ["0","2->4","6","8->9"]
                                                                                              解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public List<String> summaryRanges(int[] nums) {
                                                                                                      List<String> res = new ArrayList<>();
                                                                                                      for (int i = 0, j = 1; i < nums.length; i = j++) {
                                                                                                          while (j < nums.length && nums[j] - nums[j - 1] == 1) {
                                                                                                              ++j;
                                                                                                          }
                                                                                                          if (j - i == 1) {
                                                                                                              res.add(String.valueOf(nums[i]));
                                                                                                          } else {
                                                                                                              res.add(nums[i] + "->" + nums[j - 1]);
                                                                                                          }
                                                                                                      }
                                                                                                      return res;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16

                                                                                              229. 求众数 II

                                                                                              题目描述

                                                                                              给定一个大小为 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

                                                                                              说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

                                                                                              示例 1:

                                                                                              输入: [3,2,3]
                                                                                              输出: [3]

                                                                                              示例 2:

                                                                                              输入: [1,1,1,3,3,2,2,2]
                                                                                              输出: [1,2]

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public List<Integer> majorityElement(int[] nums) {
                                                                                                      int[] candidate = new int[2];
                                                                                                      int[] cnt = new int[2];
                                                                                                      for (int num : nums) {
                                                                                                          if (num == candidate[0]) {
                                                                                                              ++cnt[0];
                                                                                                          } else if (num == candidate[1]) {
                                                                                                              ++cnt[1];
                                                                                                          } else if (cnt[0] == 0) {
                                                                                                              candidate[0] = num;
                                                                                                              cnt[0] = 1;
                                                                                                          } else if (cnt[1] == 0) {
                                                                                                              candidate[1] = num;
                                                                                                              cnt[1] = 1;
                                                                                                          } else {
                                                                                                              --cnt[0];
                                                                                                              --cnt[1];
                                                                                                          }
                                                                                                      }
                                                                                                      Arrays.fill(cnt, 0);
                                                                                                      for (int num : nums) {
                                                                                                          if (num == candidate[0]) {
                                                                                                              ++cnt[0];
                                                                                                          } else if (num == candidate[1]) {
                                                                                                              ++cnt[1];
                                                                                                          }
                                                                                                      }
                                                                                                      List<Integer> res = new ArrayList<>();
                                                                                                      if (cnt[0] > nums.length / 3) {
                                                                                                          res.add(candidate[0]);
                                                                                                      }
                                                                                                      if (cnt[1] > nums.length / 3) {
                                                                                                          res.add(candidate[1]);
                                                                                                      }
                                                                                                      return res;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38

                                                                                              230. 二叉搜索树中第 K 小的元素

                                                                                              题目描述

                                                                                              给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 个最小的元素。

                                                                                              说明:
                                                                                              你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

                                                                                              示例 1:

                                                                                              输入: root = [3,1,4,null,2], k = 1
                                                                                                 3
                                                                                                / \
                                                                                               1   4
                                                                                                \
                                                                                                 2
                                                                                              输出: 1

                                                                                              示例 2:

                                                                                              输入: root = [5,3,6,2,4,null,null,1], k = 3
                                                                                                     5
                                                                                                    / \
                                                                                                   3   6
                                                                                                  / \
                                                                                                 2   4
                                                                                                /
                                                                                               1
                                                                                              输出: 3

                                                                                              进阶:
                                                                                              如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int kthSmallest(TreeNode root, int k) {
                                                                                                      Deque<TreeNode> stack = new ArrayDeque<>();
                                                                                                      while (!stack.isEmpty() || root != null) {
                                                                                                          while (root != null) {
                                                                                                              stack.push(root);
                                                                                                              root = root.left;
                                                                                                          }
                                                                                                          root = stack.pop();
                                                                                                          if (--k == 0) {
                                                                                                              return root.val;
                                                                                                          }
                                                                                                          root = root.right;
                                                                                                      }
                                                                                                      return 0;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17

                                                                                              231. 2 的幂

                                                                                              题目描述

                                                                                              给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

                                                                                              示例 1:

                                                                                              输入: 1
                                                                                              输出: true
                                                                                              解释: 20 = 1

                                                                                              示例 2:

                                                                                              输入: 16
                                                                                              输出: true
                                                                                              解释: 24 = 16

                                                                                              示例 3:

                                                                                              输入: 218
                                                                                              输出: false

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public boolean isPowerOfTwo(int n) {
                                                                                                      return n > 0 && (n & -n) == n;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5

                                                                                              232. 用栈实现队列

                                                                                              题目描述

                                                                                              使用栈实现队列的下列操作:

                                                                                              • push(x) -- 将一个元素放入队列的尾部。
                                                                                              • pop() -- 从队列首部移除元素。
                                                                                              • peek() -- 返回队列首部的元素。
                                                                                              • empty() -- 返回队列是否为空。

                                                                                              示例:

                                                                                              MyQueue queue = new MyQueue();
                                                                                              queue.push(1);
                                                                                              queue.push(2);  
                                                                                              queue.peek();  // 返回 1
                                                                                              queue.pop();   // 返回 1
                                                                                              queue.empty(); // 返回 false

                                                                                              说明:

                                                                                              • 你只能使用标准的栈操作 -- 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
                                                                                              • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
                                                                                              • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

                                                                                              解法

                                                                                              Java

                                                                                              class MyQueue {
                                                                                                  private Deque<Integer> s1;
                                                                                                  private Deque<Integer> s2;
                                                                                                  /** Initialize your data structure here. */
                                                                                                  public MyQueue() {
                                                                                                      s1 = new ArrayDeque<>();
                                                                                                      s2 = new ArrayDeque<>();
                                                                                                  }
                                                                                                  /** Push element x to the back of queue. */
                                                                                                  public void push(int x) {
                                                                                                      s1.push(x);
                                                                                                  }
                                                                                                  /** Removes the element from in front of queue and returns that element. */
                                                                                                  public int pop() {
                                                                                                      move();
                                                                                                      return s2.pop();
                                                                                                  }
                                                                                                  /** Get the front element. */
                                                                                                  public int peek() {
                                                                                                      move();
                                                                                                      return s2.peek();
                                                                                                  }
                                                                                                  /** Returns whether the queue is empty. */
                                                                                                  public boolean empty() {
                                                                                                      return s1.isEmpty() && s2.isEmpty();
                                                                                                  }
                                                                                                  /** Move elements from s1 to s2. */
                                                                                                  private void move() {
                                                                                                      if (s2.isEmpty()) {
                                                                                                          while (!s1.isEmpty()) {
                                                                                                              s2.push(s1.pop());
                                                                                                          }
                                                                                                      }
                                                                                                  }
                                                                                              }
                                                                                              /**
                                                                                               * Your MyQueue object will be instantiated and called as such:
                                                                                               * MyQueue obj = new MyQueue();
                                                                                               * obj.push(x);
                                                                                               * int param_2 = obj.pop();
                                                                                               * int param_3 = obj.peek();
                                                                                               * boolean param_4 = obj.empty();
                                                                                               */
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38
                                                                                              • 39
                                                                                              • 40
                                                                                              • 41
                                                                                              • 42
                                                                                              • 43

                                                                                              233. 数字 1 的个数

                                                                                              题目描述

                                                                                              给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

                                                                                              示例:

                                                                                              输入: 13
                                                                                              输出: 6 
                                                                                              解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

                                                                                              解法

                                                                                              Java

                                                                                              class Solution {
                                                                                                  public int countDigitOne(int n) {
                                                                                                      int index = 1;
                                                                                                      int count = 0;
                                                                                                      int high = n,cur = 0,low = 0;
                                                                                                      while(high > 0){
                                                                                                          high /= 10;
                                                                                                          cur = (n / index) % 10;
                                                                                                          low = n - (n / index) * index;
                                                                                                          if(cur == 0) count += high * index;
                                                                                                          if(cur == 1) count += high * index + low + 1;
                                                                                                          if(cur > 1) count += (high+1) * index;
                                                                                                          index *= 10;
                                                                                                      }
                                                                                                      return count;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17

                                                                                              234. 回文链表

                                                                                              题目描述

                                                                                              请判断一个链表是否为回文链表。

                                                                                              示例 1:

                                                                                              输入: 1->2
                                                                                              输出: false

                                                                                              示例 2:

                                                                                              输入: 1->2->2->1
                                                                                              输出: true
                                                                                              

                                                                                              进阶:
                                                                                              你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

                                                                                              解法

                                                                                              先用快慢指针找到链表的中点,接着反转右半部分的链表。然后同时遍历前后两段链表,若前后两段链表节点对应的值不等,说明不是回文链表,否则说明是回文链表。

                                                                                              Java

                                                                                              /**
                                                                                               * Definition for singly-linked list.
                                                                                               * public class ListNode {
                                                                                               *     int val;
                                                                                               *     ListNode next;
                                                                                               *     ListNode(int x) { val = x; }
                                                                                               * }
                                                                                               */
                                                                                              class Solution {
                                                                                                  public boolean isPalindrome(ListNode head) {
                                                                                                      if (head == null || head.next == null) {
                                                                                                          return true;
                                                                                                      }
                                                                                                      ListNode slow = head;
                                                                                                      ListNode fast = head.next;
                                                                                                      while (fast != null && fast.next != null) {
                                                                                                          slow = slow.next;
                                                                                                          fast = fast.next.next;
                                                                                                      }
                                                                                                      ListNode cur = slow.next;
                                                                                                      slow.next = null;
                                                                                                      ListNode pre = null;
                                                                                                      while (cur != null) {
                                                                                                          ListNode t = cur.next;
                                                                                                          cur.next = pre;
                                                                                                          pre = cur;
                                                                                                          cur = t;
                                                                                                      }
                                                                                                      while (pre != null) {
                                                                                                          if (pre.val != head.val) {
                                                                                                              return false;
                                                                                                          }
                                                                                                          pre = pre.next;
                                                                                                          head = head.next;
                                                                                                      }
                                                                                                      return true;
                                                                                                  }
                                                                                              }
                                                                                              
                                                                                              • 1
                                                                                              • 2
                                                                                              • 3
                                                                                              • 4
                                                                                              • 5
                                                                                              • 6
                                                                                              • 7
                                                                                              • 8
                                                                                              • 9
                                                                                              • 10
                                                                                              • 11
                                                                                              • 12
                                                                                              • 13
                                                                                              • 14
                                                                                              • 15
                                                                                              • 16
                                                                                              • 17
                                                                                              • 18
                                                                                              • 19
                                                                                              • 20
                                                                                              • 21
                                                                                              • 22
                                                                                              • 23
                                                                                              • 24
                                                                                              • 25
                                                                                              • 26
                                                                                              • 27
                                                                                              • 28
                                                                                              • 29
                                                                                              • 30
                                                                                              • 31
                                                                                              • 32
                                                                                              • 33
                                                                                              • 34
                                                                                              • 35
                                                                                              • 36
                                                                                              • 37
                                                                                              • 38

                                                                                              235. 二叉搜索树的最近公共祖先

                                                                                              题目描述

                                                                                              给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

                                                                                              百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

                                                                                              例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

                                                                                              在这里插入图片描述

                                                                                              示例 1:

                                                                                              输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
                                                                                              输出: 6 
                                                                                              解释: 节点 2 和节点 8 的最近公共祖先是 6。
                                                                                              

                                                                                                    示例 2:

                                                                                                    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
                                                                                                    输出: 2
                                                                                                    解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

                                                                                                           

                                                                                                          说明:

                                                                                                          • 所有节点的值都是唯一的。
                                                                                                          • p、q 为不同节点且均存在于给定的二叉搜索树中。

                                                                                                          解法

                                                                                                          从上到下搜索,找到第一个值位于 [p, q] 之间的结点即可。既可以用迭代实现,也可以用递归实现。

                                                                                                          Java

                                                                                                          迭代:

                                                                                                          /**
                                                                                                           * Definition for a binary tree node.
                                                                                                           * public class TreeNode {
                                                                                                           *     int val;
                                                                                                           *     TreeNode left;
                                                                                                           *     TreeNode right;
                                                                                                           *     TreeNode(int x) { val = x; }
                                                                                                           * }
                                                                                                           */
                                                                                                          class Solution {
                                                                                                              public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
                                                                                                                  while (root != null) {
                                                                                                                      if (root.val < p.val && root.val < q.val) root = root.right;
                                                                                                                      else if (root.val > p.val && root.val > q.val) root = root.left;
                                                                                                                      else return root;
                                                                                                                  }
                                                                                                                  return root;
                                                                                                              }
                                                                                                          }
                                                                                                          
                                                                                                          • 1
                                                                                                          • 2
                                                                                                          • 3
                                                                                                          • 4
                                                                                                          • 5
                                                                                                          • 6
                                                                                                          • 7
                                                                                                          • 8
                                                                                                          • 9
                                                                                                          • 10
                                                                                                          • 11
                                                                                                          • 12
                                                                                                          • 13
                                                                                                          • 14
                                                                                                          • 15
                                                                                                          • 16
                                                                                                          • 17
                                                                                                          • 18
                                                                                                          • 19

                                                                                                          递归:

                                                                                                          /**
                                                                                                           * Definition for a binary tree node.
                                                                                                           * public class TreeNode {
                                                                                                           *     int val;
                                                                                                           *     TreeNode left;
                                                                                                           *     TreeNode right;
                                                                                                           *     TreeNode(int x) { val = x; }
                                                                                                           * }
                                                                                                           */
                                                                                                          class Solution {
                                                                                                              public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
                                                                                                                  if (root == null) return null;
                                                                                                                  if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
                                                                                                                  if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
                                                                                                                  return root;
                                                                                                              }
                                                                                                          }
                                                                                                          
                                                                                                          • 1
                                                                                                          • 2
                                                                                                          • 3
                                                                                                          • 4
                                                                                                          • 5
                                                                                                          • 6
                                                                                                          • 7
                                                                                                          • 8
                                                                                                          • 9
                                                                                                          • 10
                                                                                                          • 11
                                                                                                          • 12
                                                                                                          • 13
                                                                                                          • 14
                                                                                                          • 15
                                                                                                          • 16
                                                                                                          • 17

                                                                                                          236. 二叉树的最近公共祖先

                                                                                                          题目描述

                                                                                                          给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

                                                                                                          百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

                                                                                                          例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

                                                                                                          在这里插入图片描述

                                                                                                          示例 1:

                                                                                                          输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
                                                                                                          输出: 3
                                                                                                          解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
                                                                                                          

                                                                                                                示例 2:

                                                                                                                输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
                                                                                                                输出: 5
                                                                                                                解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
                                                                                                                

                                                                                                                       

                                                                                                                      说明:

                                                                                                                      • 所有节点的值都是唯一的。
                                                                                                                      • p、q 为不同节点且均存在于给定的二叉树中。

                                                                                                                      解法

                                                                                                                      根据“最近公共祖先”的定义,若 root 是 p, q 的最近公共祖先 ,则只可能为以下情况之一:

                                                                                                                      • 如果 p 和 q 分别是 root 的左右节点,那么 root 就是我们要找的最近公共祖先;
                                                                                                                      • 如果 p 和 q 都是 root 的左节点,那么返回 lowestCommonAncestor(root.left, p, q)
                                                                                                                      • 如果 p 和 q 都是 root 的右节点,那么返回 lowestCommonAncestor(root.right, p, q)
                                                                                                                        边界条件讨论
                                                                                                                      • 如果 root 为 null,则说明我们已经找到最底了,返回 null 表示没找到;
                                                                                                                      • 如果 root 与 p 相等或者与 q 相等,则返回 root;
                                                                                                                      • 如果左子树没找到,递归函数返回 null,证明 p 和 q 同在 root 的右侧,那么最终的公共祖先就是右子树找到的结点;
                                                                                                                      • 如果右子树没找到,递归函数返回 null,证明 p 和 q 同在 root 的左侧,那么最终的公共祖先就是左子树找到的结点。

                                                                                                                      Java

                                                                                                                      /**
                                                                                                                       * Definition for a binary tree node.
                                                                                                                       * public class TreeNode {
                                                                                                                       *     int val;
                                                                                                                       *     TreeNode left;
                                                                                                                       *     TreeNode right;
                                                                                                                       *     TreeNode(int x) { val = x; }
                                                                                                                       * }
                                                                                                                       */
                                                                                                                      class Solution {
                                                                                                                          public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
                                                                                                                              if (root == null || root == p || root == q) return root;
                                                                                                                              TreeNode left = lowestCommonAncestor(root.left, p, q);
                                                                                                                              TreeNode right = lowestCommonAncestor(root.right, p, q);
                                                                                                                              if (left == null) return right;
                                                                                                                              if (right == null) return left;
                                                                                                                              return root;
                                                                                                                          }
                                                                                                                      }
                                                                                                                      
                                                                                                                      • 1
                                                                                                                      • 2
                                                                                                                      • 3
                                                                                                                      • 4
                                                                                                                      • 5
                                                                                                                      • 6
                                                                                                                      • 7
                                                                                                                      • 8
                                                                                                                      • 9
                                                                                                                      • 10
                                                                                                                      • 11
                                                                                                                      • 12
                                                                                                                      • 13
                                                                                                                      • 14
                                                                                                                      • 15
                                                                                                                      • 16
                                                                                                                      • 17
                                                                                                                      • 18
                                                                                                                      • 19

                                                                                                                      237. 删除链表中的节点

                                                                                                                      题目描述

                                                                                                                      请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

                                                                                                                      现有一个链表 -- head = [4,5,1,9],它可以表示为:

                                                                                                                      在这里插入图片描述

                                                                                                                      示例 1:

                                                                                                                      输入: head = [4,5,1,9], node = 5
                                                                                                                      输出: [4,1,9]
                                                                                                                      解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
                                                                                                                      

                                                                                                                      示例 2:

                                                                                                                      输入: head = [4,5,1,9], node = 1
                                                                                                                      输出: [4,5,9]
                                                                                                                      解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
                                                                                                                      

                                                                                                                       

                                                                                                                      说明:

                                                                                                                      • 链表至少包含两个节点。
                                                                                                                      • 链表中所有节点的值都是唯一的。
                                                                                                                      • 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
                                                                                                                      • 不要从你的函数中返回任何结果。

                                                                                                                      解法

                                                                                                                      node.next 节点的值赋给 node,然后将 node.next 指向 node.next 的下一个节点。

                                                                                                                      Java

                                                                                                                      /**
                                                                                                                       * Definition for singly-linked list.
                                                                                                                       * public class ListNode {
                                                                                                                       *     int val;
                                                                                                                       *     ListNode next;
                                                                                                                       *     ListNode(int x) { val = x; }
                                                                                                                       * }
                                                                                                                       */
                                                                                                                      class Solution {
                                                                                                                          public void deleteNode(ListNode node) {
                                                                                                                              node.val = node.next.val;
                                                                                                                              node.next = node.next.next;
                                                                                                                          }
                                                                                                                      }
                                                                                                                      
                                                                                                                      • 1
                                                                                                                      • 2
                                                                                                                      • 3
                                                                                                                      • 4
                                                                                                                      • 5
                                                                                                                      • 6
                                                                                                                      • 7
                                                                                                                      • 8
                                                                                                                      • 9
                                                                                                                      • 10
                                                                                                                      • 11
                                                                                                                      • 12
                                                                                                                      • 13
                                                                                                                      • 14

                                                                                                                      238. 除自身以外数组的乘积

                                                                                                                      题目描述

                                                                                                                      给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

                                                                                                                       

                                                                                                                      示例:

                                                                                                                      输入: [1,2,3,4]
                                                                                                                      输出: [24,12,8,6]

                                                                                                                           

                                                                                                                          提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

                                                                                                                          说明: 不要使用除法,且在 O(n) 时间复杂度内完成此题。

                                                                                                                          进阶:
                                                                                                                          你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

                                                                                                                          解法

                                                                                                                          Java

                                                                                                                          class Solution {
                                                                                                                              public int[] productExceptSelf(int[] nums) {
                                                                                                                                  int n = nums.length;
                                                                                                                                  int[] output = new int[n];
                                                                                                                                  for (int i = 0, left = 1; i < n; ++i) {
                                                                                                                                      output[i] = left;
                                                                                                                                      left *= nums[i];
                                                                                                                                  }
                                                                                                                                  for (int i = n - 1, right = 1; i >= 0; --i) {
                                                                                                                                      output[i] *= right;
                                                                                                                                      right *= nums[i];
                                                                                                                                  }
                                                                                                                                  return output;
                                                                                                                              }
                                                                                                                          }
                                                                                                                          
                                                                                                                          • 1
                                                                                                                          • 2
                                                                                                                          • 3
                                                                                                                          • 4
                                                                                                                          • 5
                                                                                                                          • 6
                                                                                                                          • 7
                                                                                                                          • 8
                                                                                                                          • 9
                                                                                                                          • 10
                                                                                                                          • 11
                                                                                                                          • 12
                                                                                                                          • 13
                                                                                                                          • 14
                                                                                                                          • 15

                                                                                                                          239. 滑动窗口最大值

                                                                                                                          题目描述

                                                                                                                          给定一个数组 nums,有一个大小为 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

                                                                                                                          返回滑动窗口中的最大值。

                                                                                                                           

                                                                                                                          示例:

                                                                                                                          输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
                                                                                                                          输出: [3,3,5,5,6,7] 
                                                                                                                          解释: 
                                                                                                                          
                                                                                                                            滑动窗口的位置                最大值
                                                                                                                          ---------------               -----
                                                                                                                          [1  3  -1] -3  5  3  6  7       3
                                                                                                                           1 [3  -1  -3] 5  3  6  7       3
                                                                                                                           1  3 [-1  -3  5] 3  6  7       5
                                                                                                                           1  3  -1 [-3  5  3] 6  7       5
                                                                                                                           1  3  -1  -3 [5  3  6] 7       6
                                                                                                                           1  3  -1  -3  5 [3  6  7]      7
                                                                                                                            • 1
                                                                                                                            • 2

                                                                                                                             

                                                                                                                            提示:

                                                                                                                            你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。

                                                                                                                             

                                                                                                                            进阶:

                                                                                                                            你能在线性时间复杂度内解决此题吗?

                                                                                                                            解法

                                                                                                                            Java

                                                                                                                            class Solution {
                                                                                                                                public int[] maxSlidingWindow(int[] nums, int k) {
                                                                                                                                    if (nums == null || nums.length == 0 || k <= 0) {
                                                                                                                                        return new int[0];
                                                                                                                                    }
                                                                                                                                    int[] res = new int[nums.length - k + 1];
                                                                                                                                    int index = 0;
                                                                                                                                    Deque<Integer> q = new ArrayDeque<>(k);
                                                                                                                                    for (int i = 0; i < nums.length; ++i) {
                                                                                                                                        while (!q.isEmpty() && nums[i] >= nums[q.peekLast()]) {
                                                                                                                                            q.pollLast();
                                                                                                                                        }
                                                                                                                                        q.offerLast(i);
                                                                                                                                        if (i - q.peekFirst() >= k) {
                                                                                                                                            q.pollFirst();
                                                                                                                                        }
                                                                                                                                        if (i >= k - 1) {
                                                                                                                                            res[index++] = nums[q.peekFirst()];
                                                                                                                                        }
                                                                                                                                    }
                                                                                                                                    return res;
                                                                                                                                }
                                                                                                                            }
                                                                                                                            
                                                                                                                            • 1
                                                                                                                            • 2
                                                                                                                            • 3
                                                                                                                            • 4
                                                                                                                            • 5
                                                                                                                            • 6
                                                                                                                            • 7
                                                                                                                            • 8
                                                                                                                            • 9
                                                                                                                            • 10
                                                                                                                            • 11
                                                                                                                            • 12
                                                                                                                            • 13
                                                                                                                            • 14
                                                                                                                            • 15
                                                                                                                            • 16
                                                                                                                            • 17
                                                                                                                            • 18
                                                                                                                            • 19
                                                                                                                            • 20
                                                                                                                            • 21
                                                                                                                            • 22
                                                                                                                            • 23

                                                                                                                            240. 搜索二维矩阵 II

                                                                                                                            题目描述

                                                                                                                            编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

                                                                                                                            • 每行的元素从左到右升序排列。
                                                                                                                            • 每列的元素从上到下升序排列。

                                                                                                                            示例:

                                                                                                                            现有矩阵 matrix 如下:

                                                                                                                            [
                                                                                                                              [1,   4,  7, 11, 15],
                                                                                                                              [2,   5,  8, 12, 19],
                                                                                                                              [3,   6,  9, 16, 22],
                                                                                                                              [10, 13, 14, 17, 24],
                                                                                                                              [18, 21, 23, 26, 30]
                                                                                                                            ]
                                                                                                                            

                                                                                                                            给定 target = 5,返回 true

                                                                                                                            给定 target = 20,返回 false

                                                                                                                            解法

                                                                                                                            Java

                                                                                                                            class Solution {
                                                                                                                                public boolean searchMatrix(int[][] matrix, int target) {
                                                                                                                                    int i = matrix.length - 1;
                                                                                                                                    int j = 0;
                                                                                                                                    while (i >= 0 && j < matrix[0].length) {
                                                                                                                                        if (matrix[i][j] < target) {
                                                                                                                                            ++j;
                                                                                                                                        } else if (matrix[i][j] > target) {
                                                                                                                                            --i;
                                                                                                                                        } else {
                                                                                                                                            return true;
                                                                                                                                        }
                                                                                                                                    }
                                                                                                                                    return false;
                                                                                                                                }
                                                                                                                            }
                                                                                                                            
                                                                                                                            • 1
                                                                                                                            • 2
                                                                                                                            • 3
                                                                                                                            • 4
                                                                                                                            • 5
                                                                                                                            • 6
                                                                                                                            • 7
                                                                                                                            • 8
                                                                                                                            • 9
                                                                                                                            • 10
                                                                                                                            • 11
                                                                                                                            • 12
                                                                                                                            • 13
                                                                                                                            • 14
                                                                                                                            • 15
                                                                                                                            • 16

                                                                                                                            241. 为运算表达式设计优先级

                                                                                                                            题目描述

                                                                                                                            给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +- 以及 * 。

                                                                                                                            示例 1:

                                                                                                                            输入: "2-1-1"
                                                                                                                            输出: [0, 2]
                                                                                                                            解释: 
                                                                                                                            ((2-1)-1) = 0 
                                                                                                                            (2-(1-1)) = 2

                                                                                                                                示例 2:

                                                                                                                                输入: "2*3-4*5"
                                                                                                                                输出: [-34, -14, -10, -10, 10]
                                                                                                                                解释: 
                                                                                                                                (2*(3-(4*5))) = -34 
                                                                                                                                ((2*3)-(4*5)) = -14 
                                                                                                                                ((2*(3-4))*5) = -10 
                                                                                                                                (2*((3-4)*5)) = -10 
                                                                                                                                (((2*3)-4)*5) = 10

                                                                                                                                    解法

                                                                                                                                    Java

                                                                                                                                    public class Solution {
                                                                                                                                        public List<Integer> diffWaysToCompute(String input) {
                                                                                                                                    		List<Integer> rt = new LinkedList<Integer>();
                                                                                                                                    		int len = input.length();
                                                                                                                                    		for (int i = 0; i < len; i++) {
                                                                                                                                    			if (input.charAt(i) == '-' || input.charAt(i) == '*'
                                                                                                                                    					|| input.charAt(i) == '+') {
                                                                                                                                    				String part1 = input.substring(0, i);
                                                                                                                                    				String part2 = input.substring(i + 1);
                                                                                                                                    				List<Integer> part1Ret = diffWaysToCompute(part1);
                                                                                                                                    				List<Integer> part2Ret = diffWaysToCompute(part2);
                                                                                                                                    				for (Integer p1 : part1Ret) {
                                                                                                                                    					for (Integer p2 : part2Ret) {
                                                                                                                                    						int c = 0;
                                                                                                                                    						switch (input.charAt(i)) {
                                                                                                                                    						case '+':
                                                                                                                                    							c = p1 + p2;
                                                                                                                                    							break;
                                                                                                                                    						case '-':
                                                                                                                                    							c = p1 - p2;
                                                                                                                                    							break;
                                                                                                                                    						case '*':
                                                                                                                                    							c = p1 * p2;
                                                                                                                                    						}
                                                                                                                                    						rt.add(c);
                                                                                                                                    					}
                                                                                                                                    				}
                                                                                                                                    			}
                                                                                                                                    		}
                                                                                                                                    		if (rt.size() == 0) {
                                                                                                                                    			rt.add(Integer.valueOf(input));
                                                                                                                                    		}
                                                                                                                                    		return rt;
                                                                                                                                    	
                                                                                                                                            
                                                                                                                                        }
                                                                                                                                    }
                                                                                                                                    
                                                                                                                                    • 1
                                                                                                                                    • 2
                                                                                                                                    • 3
                                                                                                                                    • 4
                                                                                                                                    • 5
                                                                                                                                    • 6
                                                                                                                                    • 7
                                                                                                                                    • 8
                                                                                                                                    • 9
                                                                                                                                    • 10
                                                                                                                                    • 11
                                                                                                                                    • 12
                                                                                                                                    • 13
                                                                                                                                    • 14
                                                                                                                                    • 15
                                                                                                                                    • 16
                                                                                                                                    • 17
                                                                                                                                    • 18
                                                                                                                                    • 19
                                                                                                                                    • 20
                                                                                                                                    • 21
                                                                                                                                    • 22
                                                                                                                                    • 23
                                                                                                                                    • 24
                                                                                                                                    • 25
                                                                                                                                    • 26
                                                                                                                                    • 27
                                                                                                                                    • 28
                                                                                                                                    • 29
                                                                                                                                    • 30
                                                                                                                                    • 31
                                                                                                                                    • 32
                                                                                                                                    • 33
                                                                                                                                    • 34
                                                                                                                                    • 35
                                                                                                                                    • 36
                                                                                                                                    • 37

                                                                                                                                    242. 有效的字母异位词

                                                                                                                                    题目描述

                                                                                                                                    给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

                                                                                                                                    示例 1:

                                                                                                                                    输入: s = "anagram", t = "nagaram"
                                                                                                                                    输出: true
                                                                                                                                    

                                                                                                                                    示例 2:

                                                                                                                                    输入: s = "rat", t = "car"
                                                                                                                                    输出: false

                                                                                                                                    说明:
                                                                                                                                    你可以假设字符串只包含小写字母。

                                                                                                                                    进阶:
                                                                                                                                    如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

                                                                                                                                    解法

                                                                                                                                    Java

                                                                                                                                    class Solution {
                                                                                                                                    	public boolean isAnagram(String s, String t) {
                                                                                                                                    		char[] val1 = s.toCharArray();
                                                                                                                                    		char[] val2 = t.toCharArray();
                                                                                                                                    		Arrays.sort(val1);
                                                                                                                                    		Arrays.sort(val2);
                                                                                                                                    		String s1 = new String(val1);
                                                                                                                                    		String s2 = new String(val2);
                                                                                                                                    		return s1.equals(s2);
                                                                                                                                    	}
                                                                                                                                    }
                                                                                                                                    
                                                                                                                                    • 1
                                                                                                                                    • 2
                                                                                                                                    • 3
                                                                                                                                    • 4
                                                                                                                                    • 5
                                                                                                                                    • 6
                                                                                                                                    • 7
                                                                                                                                    • 8
                                                                                                                                    • 9
                                                                                                                                    • 10
                                                                                                                                    • 11

                                                                                                                                    243. 最短单词距离

                                                                                                                                    题目描述

                                                                                                                                    给定一个单词列表和两个单词 word1word2,返回列表中这两个单词之间的最短距离。

                                                                                                                                    示例:
                                                                                                                                    假设 words = ["practice", "makes", "perfect", "coding", "makes"]

                                                                                                                                    输入: word1 = “coding”, word2 = “practice”
                                                                                                                                    输出: 3
                                                                                                                                    
                                                                                                                                        输入: word1 = "makes", word2 = "coding"
                                                                                                                                        输出: 1
                                                                                                                                        

                                                                                                                                            注意:
                                                                                                                                            你可以假设 word1 不等于 word2, 并且 word1word2 都在列表里。

                                                                                                                                            解法

                                                                                                                                            Java

                                                                                                                                            class Solution {
                                                                                                                                                public int shortestDistance(String[] words, String word1, String word2) {
                                                                                                                                                    int w1 = -1, w2 = -1, ans = Integer.MAX_VALUE;
                                                                                                                                                    for (int i = 0; i < words.length; i++) {
                                                                                                                                                        if (Objects.equals(words[i], word1)) {
                                                                                                                                                            w1 = i;
                                                                                                                                                            if (w2 >= 0) {
                                                                                                                                                                ans = Math.min(w1 - w2, ans);
                                                                                                                                                            }
                                                                                                                                                        } else if (Objects.equals(words[i], word2)) {
                                                                                                                                                            w2 = i;
                                                                                                                                                            if (w1 >= 0) {
                                                                                                                                                                ans = Math.min(w2 - w1, ans);
                                                                                                                                                            }
                                                                                                                                                        }
                                                                                                                                                    }
                                                                                                                                                    return ans;
                                                                                                                                                }
                                                                                                                                            }
                                                                                                                                            
                                                                                                                                            • 1
                                                                                                                                            • 2
                                                                                                                                            • 3
                                                                                                                                            • 4
                                                                                                                                            • 5
                                                                                                                                            • 6
                                                                                                                                            • 7
                                                                                                                                            • 8
                                                                                                                                            • 9
                                                                                                                                            • 10
                                                                                                                                            • 11
                                                                                                                                            • 12
                                                                                                                                            • 13
                                                                                                                                            • 14
                                                                                                                                            • 15
                                                                                                                                            • 16
                                                                                                                                            • 17
                                                                                                                                            • 18
                                                                                                                                            • 19

                                                                                                                                            244. 最短单词距离 II

                                                                                                                                            题目描述

                                                                                                                                            请设计一个类,使该类的构造函数能够接收一个单词列表。然后再实现一个方法,该方法能够分别接收两个单词 word1word2,并返回列表中这两个单词之间的最短距离。您的方法将被以不同的参数调用 多次

                                                                                                                                            示例:
                                                                                                                                            假设 words = ["practice", "makes", "perfect", "coding", "makes"]

                                                                                                                                            输入: word1 = “coding”, word2 = “practice”
                                                                                                                                            输出: 3
                                                                                                                                            
                                                                                                                                                输入: word1 = "makes", word2 = "coding"
                                                                                                                                                输出: 1

                                                                                                                                                    注意:
                                                                                                                                                    你可以假设 word1 不等于 word2, 并且 word1word2 都在列表里。

                                                                                                                                                    解法

                                                                                                                                                    Java

                                                                                                                                                    class WordDistance {
                                                                                                                                                        Map<String, List<Integer>> map = new HashMap<>();
                                                                                                                                                        public WordDistance(String[] words) {
                                                                                                                                                            for (int i = 0; i < words.length; i++) {
                                                                                                                                                                List<Integer> indexList = map.get(words[i]) == null ? new ArrayList<>() : map.get(words[i]);
                                                                                                                                                                indexList.add(i);
                                                                                                                                                                map.put(words[i], indexList);
                                                                                                                                                            }
                                                                                                                                                        }
                                                                                                                                                        public int shortest(String word1, String word2) {
                                                                                                                                                            List<Integer> list1 = map.get(word1);
                                                                                                                                                            List<Integer> list2 = map.get(word2);
                                                                                                                                                            int ans = Integer.MAX_VALUE;
                                                                                                                                                            for (int l1 : list1) {
                                                                                                                                                                for (int l2 : list2) {
                                                                                                                                                                    ans = Math.min(ans, Math.abs(l1 - l2));
                                                                                                                                                                }
                                                                                                                                                            }
                                                                                                                                                            return ans;
                                                                                                                                                        }
                                                                                                                                                    }
                                                                                                                                                    /**
                                                                                                                                                     * Your WordDistance object will be instantiated and called as such:
                                                                                                                                                     * WordDistance obj = new WordDistance(words);
                                                                                                                                                     * int param_1 = obj.shortest(word1,word2);
                                                                                                                                                     */
                                                                                                                                                    
                                                                                                                                                    • 1
                                                                                                                                                    • 2
                                                                                                                                                    • 3
                                                                                                                                                    • 4
                                                                                                                                                    • 5
                                                                                                                                                    • 6
                                                                                                                                                    • 7
                                                                                                                                                    • 8
                                                                                                                                                    • 9
                                                                                                                                                    • 10
                                                                                                                                                    • 11
                                                                                                                                                    • 12
                                                                                                                                                    • 13
                                                                                                                                                    • 14
                                                                                                                                                    • 15
                                                                                                                                                    • 16
                                                                                                                                                    • 17
                                                                                                                                                    • 18
                                                                                                                                                    • 19
                                                                                                                                                    • 20
                                                                                                                                                    • 21
                                                                                                                                                    • 22
                                                                                                                                                    • 23
                                                                                                                                                    • 24
                                                                                                                                                    • 25
                                                                                                                                                    • 26

                                                                                                                                                    245. 最短单词距离 III

                                                                                                                                                    题目描述

                                                                                                                                                    给定一个单词列表和两个单词 word1word2,返回列表中这两个单词之间的最短距离。

                                                                                                                                                    word1word2 是有可能相同的,并且它们将分别表示为列表中两个独立的单词。

                                                                                                                                                    示例:
                                                                                                                                                    假设 words = ["practice", "makes", "perfect", "coding", "makes"].

                                                                                                                                                    输入: word1 = “makes”, word2 = “coding”
                                                                                                                                                    输出: 1
                                                                                                                                                    
                                                                                                                                                        输入: word1 = "makes", word2 = "makes"
                                                                                                                                                        输出: 3
                                                                                                                                                        

                                                                                                                                                            注意:
                                                                                                                                                            你可以假设 word1word2 都在列表里。

                                                                                                                                                            解法

                                                                                                                                                            Java

                                                                                                                                                            class Solution {
                                                                                                                                                                public int shortestWordDistance(String[] words, String word1, String word2) {
                                                                                                                                                                    int w1 = -1, w2 = -1, ans = Integer.MAX_VALUE;
                                                                                                                                                                    boolean same = word1.equals(word2);
                                                                                                                                                                    for (int i = 0; i < words.length; i++) {
                                                                                                                                                                        if (same) {
                                                                                                                                                                            if (Objects.equals(words[i], word1)) {
                                                                                                                                                                                if (w1 == -1) {
                                                                                                                                                                                    w1 = i;
                                                                                                                                                                                } else {
                                                                                                                                                                                    ans = Math.min(ans, i - w1);
                                                                                                                                                                                    w1 = i;
                                                                                                                                                                                }
                                                                                                                                                                            }
                                                                                                                                                                        } else if (Objects.equals(words[i], word1)) {
                                                                                                                                                                            w1 = i;
                                                                                                                                                                            if (w2 >= 0) {
                                                                                                                                                                                ans = Math.min(w1 - w2, ans);
                                                                                                                                                                            }
                                                                                                                                                                        } else if (Objects.equals(words[i], word2)) {
                                                                                                                                                                            w2 = i;
                                                                                                                                                                            if (w1 >= 0) {
                                                                                                                                                                                ans = Math.min(w2 - w1, ans);
                                                                                                                                                                            }
                                                                                                                                                                        }
                                                                                                                                                                    }
                                                                                                                                                                    return ans;
                                                                                                                                                                }
                                                                                                                                                            }
                                                                                                                                                            
                                                                                                                                                            • 1
                                                                                                                                                            • 2
                                                                                                                                                            • 3
                                                                                                                                                            • 4
                                                                                                                                                            • 5
                                                                                                                                                            • 6
                                                                                                                                                            • 7
                                                                                                                                                            • 8
                                                                                                                                                            • 9
                                                                                                                                                            • 10
                                                                                                                                                            • 11
                                                                                                                                                            • 12
                                                                                                                                                            • 13
                                                                                                                                                            • 14
                                                                                                                                                            • 15
                                                                                                                                                            • 16
                                                                                                                                                            • 17
                                                                                                                                                            • 18
                                                                                                                                                            • 19
                                                                                                                                                            • 20
                                                                                                                                                            • 21
                                                                                                                                                            • 22
                                                                                                                                                            • 23
                                                                                                                                                            • 24
                                                                                                                                                            • 25
                                                                                                                                                            • 26
                                                                                                                                                            • 27
                                                                                                                                                            • 28
                                                                                                                                                            • 29

                                                                                                                                                            246. 中心对称数

                                                                                                                                                            题目描述

                                                                                                                                                            中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。

                                                                                                                                                            请写一个函数来判断该数字是否是中心对称数,其输入将会以一个字符串的形式来表达数字。

                                                                                                                                                            示例 1:

                                                                                                                                                            输入: num = "69"
                                                                                                                                                            输出: true
                                                                                                                                                            

                                                                                                                                                            示例 2:

                                                                                                                                                            输入: num = "88"
                                                                                                                                                            输出: true

                                                                                                                                                            示例 3:

                                                                                                                                                            输入: num = "962"
                                                                                                                                                            输出: false

                                                                                                                                                            示例 4:

                                                                                                                                                            输入:num = "1"
                                                                                                                                                            输出:true
                                                                                                                                                            

                                                                                                                                                            解法

                                                                                                                                                            Java

                                                                                                                                                            class Solution {
                                                                                                                                                                public boolean isStrobogrammatic(String num) {
                                                                                                                                                                    int n = num.length();
                                                                                                                                                                    for (int i = 0, j = n - 1; i <= j; ++i, --j) {
                                                                                                                                                                        if (!match(num.charAt(i), num.charAt(j))) return false;
                                                                                                                                                                    }
                                                                                                                                                                    return true;
                                                                                                                                                                }
                                                                                                                                                                private boolean match(char a, char b) {
                                                                                                                                                                    switch (a) {
                                                                                                                                                                        case '0':
                                                                                                                                                                        case '1':
                                                                                                                                                                        case '8':
                                                                                                                                                                            return a == b;
                                                                                                                                                                        case '6':
                                                                                                                                                                            return b == '9';
                                                                                                                                                                        case '9':
                                                                                                                                                                            return b == '6';
                                                                                                                                                                        default:
                                                                                                                                                                            return false;
                                                                                                                                                                    }
                                                                                                                                                                }
                                                                                                                                                            }
                                                                                                                                                            
                                                                                                                                                            • 1
                                                                                                                                                            • 2
                                                                                                                                                            • 3
                                                                                                                                                            • 4
                                                                                                                                                            • 5
                                                                                                                                                            • 6
                                                                                                                                                            • 7
                                                                                                                                                            • 8
                                                                                                                                                            • 9
                                                                                                                                                            • 10
                                                                                                                                                            • 11
                                                                                                                                                            • 12
                                                                                                                                                            • 13
                                                                                                                                                            • 14
                                                                                                                                                            • 15
                                                                                                                                                            • 16
                                                                                                                                                            • 17
                                                                                                                                                            • 18
                                                                                                                                                            • 19
                                                                                                                                                            • 20
                                                                                                                                                            • 21
                                                                                                                                                            • 22
                                                                                                                                                            • 23

                                                                                                                                                            247. 中心对称数 II

                                                                                                                                                            题目描述

                                                                                                                                                            中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。

                                                                                                                                                            找到所有长度为 n 的中心对称数。

                                                                                                                                                            示例 :

                                                                                                                                                            输入:  n = 2
                                                                                                                                                            输出: ["11","69","88","96"]
                                                                                                                                                            

                                                                                                                                                              解法

                                                                                                                                                              Java

                                                                                                                                                              class Solution {
                                                                                                                                                                  Map<Character, Character> map = new HashMap<>();
                                                                                                                                                                  {
                                                                                                                                                                      map.put('1', '1');
                                                                                                                                                                      map.put('0', '0');
                                                                                                                                                                      map.put('6', '9');
                                                                                                                                                                      map.put('9', '6');
                                                                                                                                                                      map.put('8', '8');
                                                                                                                                                                  }
                                                                                                                                                                  public List<String> findStrobogrammatic(int n) {
                                                                                                                                                                      if (n == 1) {
                                                                                                                                                                          return Arrays.asList("0", "1", "8");
                                                                                                                                                                      }
                                                                                                                                                                      List<String> ans = new ArrayList<>();
                                                                                                                                                                      dfs(n, ans, "");
                                                                                                                                                                      return ans;
                                                                                                                                                                  }
                                                                                                                                                                  private void dfs(int n, List<String> ans, String tmp) {
                                                                                                                                                                      if (tmp.length() == (n + 1) / 2) {
                                                                                                                                                                          fillAns(n, ans, tmp);
                                                                                                                                                                          return;
                                                                                                                                                                      }
                                                                                                                                                                      for (char c : map.keySet()) {
                                                                                                                                                                          int num = c - '0';
                                                                                                                                                                          // 首位不能是0
                                                                                                                                                                          if (tmp.length() == 0 && num == 0) {
                                                                                                                                                                              continue;
                                                                                                                                                                          }
                                                                                                                                                                          // 奇数的中间位只能是 0 1 8
                                                                                                                                                                          if (n % 2 != 0 && tmp.length() == n / 2 && !(num == 0 || num == 1 || num == 8)) {
                                                                                                                                                                              continue;
                                                                                                                                                                          }
                                                                                                                                                                          dfs(n, ans, tmp + num);
                                                                                                                                                                      }
                                                                                                                                                                  }
                                                                                                                                                                  private void fillAns(int n, List<String> ans, String tmp) {
                                                                                                                                                                      char[] a = new char[n];
                                                                                                                                                                      for (int i = 0; i < tmp.length(); i++) {
                                                                                                                                                                          a[i] = tmp.charAt(i);
                                                                                                                                                                          a[n - i - 1] = map.get(tmp.charAt(i));
                                                                                                                                                                      }
                                                                                                                                                                      if (n % 2 != 0) {
                                                                                                                                                                          a[tmp.length() - 1] = tmp.charAt(tmp.length() - 1);
                                                                                                                                                                      }
                                                                                                                                                                      ans.add(new String(a));
                                                                                                                                                                  }
                                                                                                                                                              }
                                                                                                                                                              
                                                                                                                                                              • 1
                                                                                                                                                              • 2
                                                                                                                                                              • 3
                                                                                                                                                              • 4
                                                                                                                                                              • 5
                                                                                                                                                              • 6
                                                                                                                                                              • 7
                                                                                                                                                              • 8
                                                                                                                                                              • 9
                                                                                                                                                              • 10
                                                                                                                                                              • 11
                                                                                                                                                              • 12
                                                                                                                                                              • 13
                                                                                                                                                              • 14
                                                                                                                                                              • 15
                                                                                                                                                              • 16
                                                                                                                                                              • 17
                                                                                                                                                              • 18
                                                                                                                                                              • 19
                                                                                                                                                              • 20
                                                                                                                                                              • 21
                                                                                                                                                              • 22
                                                                                                                                                              • 23
                                                                                                                                                              • 24
                                                                                                                                                              • 25
                                                                                                                                                              • 26
                                                                                                                                                              • 27
                                                                                                                                                              • 28
                                                                                                                                                              • 29
                                                                                                                                                              • 30
                                                                                                                                                              • 31
                                                                                                                                                              • 32
                                                                                                                                                              • 33
                                                                                                                                                              • 34
                                                                                                                                                              • 35
                                                                                                                                                              • 36
                                                                                                                                                              • 37
                                                                                                                                                              • 38
                                                                                                                                                              • 39
                                                                                                                                                              • 40
                                                                                                                                                              • 41
                                                                                                                                                              • 42
                                                                                                                                                              • 43
                                                                                                                                                              • 44
                                                                                                                                                              • 45
                                                                                                                                                              • 46
                                                                                                                                                              • 47

                                                                                                                                                              252. 会议室

                                                                                                                                                              题目描述

                                                                                                                                                              给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),请你判断一个人是否能够参加这里面的全部会议。

                                                                                                                                                              示例 1:

                                                                                                                                                              输入: [[0,30],[5,10],[15,20]]
                                                                                                                                                              输出: false
                                                                                                                                                              

                                                                                                                                                                示例 2:

                                                                                                                                                                输入: [[7,10],[2,4]]
                                                                                                                                                                输出: true
                                                                                                                                                                

                                                                                                                                                                解法

                                                                                                                                                                Java

                                                                                                                                                                class Solution {
                                                                                                                                                                    public boolean canAttendMeetings(int[][] intervals) {
                                                                                                                                                                        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
                                                                                                                                                                        for (int i = 0, n = intervals.length; i < n - 1; ++i) {
                                                                                                                                                                            if (intervals[i][1] > intervals[i + 1][0]) return false;
                                                                                                                                                                        }
                                                                                                                                                                        return true;
                                                                                                                                                                    }
                                                                                                                                                                }
                                                                                                                                                                
                                                                                                                                                                • 1
                                                                                                                                                                • 2
                                                                                                                                                                • 3
                                                                                                                                                                • 4
                                                                                                                                                                • 5
                                                                                                                                                                • 6
                                                                                                                                                                • 7
                                                                                                                                                                • 8
                                                                                                                                                                • 9

                                                                                                                                                                257. 二叉树的所有路径

                                                                                                                                                                题目描述

                                                                                                                                                                给定一个二叉树,返回所有从根节点到叶子节点的路径。

                                                                                                                                                                说明: 叶子节点是指没有子节点的节点。

                                                                                                                                                                示例:

                                                                                                                                                                输入:
                                                                                                                                                                   1
                                                                                                                                                                 /   \
                                                                                                                                                                2     3
                                                                                                                                                                 \
                                                                                                                                                                  5
                                                                                                                                                                输出: ["1->2->5", "1->3"]
                                                                                                                                                                解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

                                                                                                                                                                解法

                                                                                                                                                                深度优先搜索+路径记录。

                                                                                                                                                                Java

                                                                                                                                                                /**
                                                                                                                                                                 * Definition for a binary tree node.
                                                                                                                                                                 * public class TreeNode {
                                                                                                                                                                 *     int val;
                                                                                                                                                                 *     TreeNode left;
                                                                                                                                                                 *     TreeNode right;
                                                                                                                                                                 *     TreeNode(int x) { val = x; }
                                                                                                                                                                 * }
                                                                                                                                                                 */
                                                                                                                                                                class Solution {
                                                                                                                                                                    private List<String> res;
                                                                                                                                                                    private List<String> path;
                                                                                                                                                                    public List<String> binaryTreePaths(TreeNode root) {
                                                                                                                                                                        if (root == null) return Collections.emptyList();
                                                                                                                                                                        res = new ArrayList<>();
                                                                                                                                                                        path = new ArrayList<>();
                                                                                                                                                                        dfs(root);
                                                                                                                                                                        return res;
                                                                                                                                                                    }
                                                                                                                                                                    private void dfs(TreeNode root) {
                                                                                                                                                                        if (root == null) return;
                                                                                                                                                                        path.add(String.valueOf(root.val));
                                                                                                                                                                        if (root.left == null && root.right == null) {
                                                                                                                                                                            res.add(String.join("->", path));
                                                                                                                                                                        }
                                                                                                                                                                        dfs(root.left);
                                                                                                                                                                        dfs(root.right);
                                                                                                                                                                        path.remove(path.size() - 1);
                                                                                                                                                                    }
                                                                                                                                                                }
                                                                                                                                                                
                                                                                                                                                                • 1
                                                                                                                                                                • 2
                                                                                                                                                                • 3
                                                                                                                                                                • 4
                                                                                                                                                                • 5
                                                                                                                                                                • 6
                                                                                                                                                                • 7
                                                                                                                                                                • 8
                                                                                                                                                                • 9
                                                                                                                                                                • 10
                                                                                                                                                                • 11
                                                                                                                                                                • 12
                                                                                                                                                                • 13
                                                                                                                                                                • 14
                                                                                                                                                                • 15
                                                                                                                                                                • 16
                                                                                                                                                                • 17
                                                                                                                                                                • 18
                                                                                                                                                                • 19
                                                                                                                                                                • 20
                                                                                                                                                                • 21
                                                                                                                                                                • 22
                                                                                                                                                                • 23
                                                                                                                                                                • 24
                                                                                                                                                                • 25
                                                                                                                                                                • 26
                                                                                                                                                                • 27
                                                                                                                                                                • 28
                                                                                                                                                                • 29
                                                                                                                                                                • 30

                                                                                                                                                                258. 各位相加

                                                                                                                                                                题目描述

                                                                                                                                                                给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

                                                                                                                                                                示例:

                                                                                                                                                                输入: 38
                                                                                                                                                                输出: 2 
                                                                                                                                                                解释: 各位相加的过程为3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
                                                                                                                                                                

                                                                                                                                                                        进阶:
                                                                                                                                                                        你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

                                                                                                                                                                        解法

                                                                                                                                                                        题目要求的数叫做“数根”,我们把 1~30 的数根列出来:

                                                                                                                                                                        原数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
                                                                                                                                                                        数根: 1 2 3 4 5 6 7 8 9  1  2  3  4  5  6  7  8  9  1  2  3  4  5  6  7  8  9  1  2  3
                                                                                                                                                                        
                                                                                                                                                                        • 1
                                                                                                                                                                        • 2

                                                                                                                                                                        可以看到,数根 9 个为一组,循环出现。我们可以得出下面的规律:

                                                                                                                                                                        • n = 0:数根是 0
                                                                                                                                                                        • n 是 9 的倍数:数根是 9
                                                                                                                                                                        • n 不是 9 的倍数:数根是 n % 9
                                                                                                                                                                          将上面的规律用式子:(n - 1) % 9 + 1 统一表达。

                                                                                                                                                                        Java

                                                                                                                                                                        class Solution {
                                                                                                                                                                            public int addDigits(int num) {
                                                                                                                                                                                return (num - 1) % 9 + 1;
                                                                                                                                                                            }
                                                                                                                                                                        }
                                                                                                                                                                        
                                                                                                                                                                        • 1
                                                                                                                                                                        • 2
                                                                                                                                                                        • 3
                                                                                                                                                                        • 4
                                                                                                                                                                        • 5

                                                                                                                                                                        260. 只出现一次的数字 III

                                                                                                                                                                        题目描述

                                                                                                                                                                        给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

                                                                                                                                                                        示例 :

                                                                                                                                                                        输入: [1,2,1,3,2,5]
                                                                                                                                                                        输出: [3,5]

                                                                                                                                                                            注意:

                                                                                                                                                                            1. 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
                                                                                                                                                                            2. 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

                                                                                                                                                                            解法

                                                                                                                                                                            Java

                                                                                                                                                                            class Solution {
                                                                                                                                                                                public int[] singleNumber(int[] nums) {
                                                                                                                                                                                    int xor = 0;
                                                                                                                                                                                    for (int num : nums) {
                                                                                                                                                                                        xor ^= num;
                                                                                                                                                                                    }
                                                                                                                                                                                    int diff = xor & (-xor);
                                                                                                                                                                                    int a = 0, b = 0;
                                                                                                                                                                                    for (int num : nums) {
                                                                                                                                                                                        if ((num & diff) == 0) a ^= num;
                                                                                                                                                                                        else b ^= num;
                                                                                                                                                                                    }
                                                                                                                                                                                    return new int[]{a, b};
                                                                                                                                                                                }
                                                                                                                                                                            }
                                                                                                                                                                            
                                                                                                                                                                            • 1
                                                                                                                                                                            • 2
                                                                                                                                                                            • 3
                                                                                                                                                                            • 4
                                                                                                                                                                            • 5
                                                                                                                                                                            • 6
                                                                                                                                                                            • 7
                                                                                                                                                                            • 8
                                                                                                                                                                            • 9
                                                                                                                                                                            • 10
                                                                                                                                                                            • 11
                                                                                                                                                                            • 12
                                                                                                                                                                            • 13
                                                                                                                                                                            • 14
                                                                                                                                                                            • 15

                                                                                                                                                                            263. 丑数

                                                                                                                                                                            题目描述

                                                                                                                                                                            编写一个程序判断给定的数是否为丑数。

                                                                                                                                                                            丑数就是只包含质因数 2, 3, 5 的正整数

                                                                                                                                                                            示例 1:

                                                                                                                                                                            输入: 6
                                                                                                                                                                            输出: true
                                                                                                                                                                            解释: 6 = 2 × 3

                                                                                                                                                                            示例 2:

                                                                                                                                                                            输入: 8
                                                                                                                                                                            输出: true
                                                                                                                                                                            解释: 8 = 2 × 2 × 2
                                                                                                                                                                            

                                                                                                                                                                            示例 3:

                                                                                                                                                                            输入: 14
                                                                                                                                                                            输出: false 
                                                                                                                                                                            解释: 14 不是丑数,因为它包含了另外一个质因数 7

                                                                                                                                                                                说明:

                                                                                                                                                                                1. 1 是丑数。
                                                                                                                                                                                2. 输入不会超过 32 位有符号整数的范围: [−231,  231 − 1]。

                                                                                                                                                                                解法

                                                                                                                                                                                Java

                                                                                                                                                                                class Solution {
                                                                                                                                                                                    public boolean isUgly(int num) {
                                                                                                                                                                                        if (num < 1) {
                                                                                                                                                                                            return false;
                                                                                                                                                                                        }
                                                                                                                                                                                        while (num % 2 == 0) {
                                                                                                                                                                                            num /= 2;
                                                                                                                                                                                        }
                                                                                                                                                                                        while (num % 3 == 0) {
                                                                                                                                                                                            num /= 3;
                                                                                                                                                                                        }
                                                                                                                                                                                        while (num % 5 == 0) {
                                                                                                                                                                                            num /= 5;
                                                                                                                                                                                        }
                                                                                                                                                                                        return num == 1;
                                                                                                                                                                                    }
                                                                                                                                                                                }
                                                                                                                                                                                
                                                                                                                                                                                • 1
                                                                                                                                                                                • 2
                                                                                                                                                                                • 3
                                                                                                                                                                                • 4
                                                                                                                                                                                • 5
                                                                                                                                                                                • 6
                                                                                                                                                                                • 7
                                                                                                                                                                                • 8
                                                                                                                                                                                • 9
                                                                                                                                                                                • 10
                                                                                                                                                                                • 11
                                                                                                                                                                                • 12
                                                                                                                                                                                • 13
                                                                                                                                                                                • 14
                                                                                                                                                                                • 15
                                                                                                                                                                                • 16
                                                                                                                                                                                • 17

                                                                                                                                                                                264. 丑数 II

                                                                                                                                                                                题目描述

                                                                                                                                                                                编写一个程序,找出第 n 个丑数。

                                                                                                                                                                                丑数就是只包含质因数 2, 3, 5正整数

                                                                                                                                                                                示例:

                                                                                                                                                                                输入: n = 10
                                                                                                                                                                                输出: 12
                                                                                                                                                                                解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

                                                                                                                                                                                  说明:  

                                                                                                                                                                                  1. 1 是丑数。
                                                                                                                                                                                  2. n 不超过1690。

                                                                                                                                                                                  解法

                                                                                                                                                                                  Java

                                                                                                                                                                                  class Solution {
                                                                                                                                                                                      public int nthUglyNumber(int n) {
                                                                                                                                                                                          int[] dp = new int[n];
                                                                                                                                                                                          dp[0] = 1;
                                                                                                                                                                                          int i = 0, j = 0, k = 0;
                                                                                                                                                                                          for (int idx = 1; idx < n; ++idx) {
                                                                                                                                                                                              int t = Math.min(dp[i] * 2, Math.min(dp[j] * 3, dp[k] * 5));
                                                                                                                                                                                              dp[idx] = t;
                                                                                                                                                                                              if (dp[i] * 2 == t) ++i;
                                                                                                                                                                                              if (dp[j] * 3 == t) ++j;
                                                                                                                                                                                              if (dp[k] * 5 == t) ++k;
                                                                                                                                                                                          }
                                                                                                                                                                                          return dp[n - 1];
                                                                                                                                                                                      }
                                                                                                                                                                                  }
                                                                                                                                                                                  
                                                                                                                                                                                  • 1
                                                                                                                                                                                  • 2
                                                                                                                                                                                  • 3
                                                                                                                                                                                  • 4
                                                                                                                                                                                  • 5
                                                                                                                                                                                  • 6
                                                                                                                                                                                  • 7
                                                                                                                                                                                  • 8
                                                                                                                                                                                  • 9
                                                                                                                                                                                  • 10
                                                                                                                                                                                  • 11
                                                                                                                                                                                  • 12
                                                                                                                                                                                  • 13
                                                                                                                                                                                  • 14
                                                                                                                                                                                  • 15

                                                                                                                                                                                  266. 回文排列

                                                                                                                                                                                  题目描述

                                                                                                                                                                                  给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。

                                                                                                                                                                                  示例 1:

                                                                                                                                                                                  输入: "code"
                                                                                                                                                                                  输出: false

                                                                                                                                                                                    示例 2:

                                                                                                                                                                                    输入: "aab"
                                                                                                                                                                                    输出: true

                                                                                                                                                                                      示例 3:

                                                                                                                                                                                      输入: "carerac"
                                                                                                                                                                                      输出: true

                                                                                                                                                                                        解法

                                                                                                                                                                                        利用 HashMap(字典表)统计每个字符出现的频率,至多有一个字符出现奇数次数即可。

                                                                                                                                                                                        Java

                                                                                                                                                                                        class Solution {
                                                                                                                                                                                            public boolean canPermutePalindrome(String s) {
                                                                                                                                                                                                Map<Character, Integer> map = new HashMap<>();
                                                                                                                                                                                                for (int i = 0, n = s.length(); i < n; ++i) {
                                                                                                                                                                                                    char ch = s.charAt(i);
                                                                                                                                                                                                    map.put(ch, map.getOrDefault(ch, 0) + 1);
                                                                                                                                                                                                }
                                                                                                                                                                                                int cnt = 0;
                                                                                                                                                                                                for (Map.Entry<Character, Integer> entry : map.entrySet()) {
                                                                                                                                                                                                    if (entry.getValue() % 2 != 0) {
                                                                                                                                                                                                        ++cnt;
                                                                                                                                                                                                    }
                                                                                                                                                                                                }
                                                                                                                                                                                                return cnt <= 1;
                                                                                                                                                                                            }
                                                                                                                                                                                        }
                                                                                                                                                                                        
                                                                                                                                                                                        • 1
                                                                                                                                                                                        • 2
                                                                                                                                                                                        • 3
                                                                                                                                                                                        • 4
                                                                                                                                                                                        • 5
                                                                                                                                                                                        • 6
                                                                                                                                                                                        • 7
                                                                                                                                                                                        • 8
                                                                                                                                                                                        • 9
                                                                                                                                                                                        • 10
                                                                                                                                                                                        • 11
                                                                                                                                                                                        • 12
                                                                                                                                                                                        • 13
                                                                                                                                                                                        • 14
                                                                                                                                                                                        • 15
                                                                                                                                                                                        • 16

                                                                                                                                                                                        268. 缺失数字

                                                                                                                                                                                        题目描述

                                                                                                                                                                                        给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

                                                                                                                                                                                        示例 1:

                                                                                                                                                                                        输入: [3,0,1]
                                                                                                                                                                                        输出: 2
                                                                                                                                                                                        

                                                                                                                                                                                        示例 2:

                                                                                                                                                                                        输入: [9,6,4,2,3,5,7,0,1]
                                                                                                                                                                                        输出: 8
                                                                                                                                                                                        

                                                                                                                                                                                        说明:
                                                                                                                                                                                        你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

                                                                                                                                                                                        解法

                                                                                                                                                                                        异或求解。两个相同的数异或的结果为 0。
                                                                                                                                                                                        也可以用数学求解。求出 [0..n] 的和,减去数组中所有数的和,就得到了缺失的数字。

                                                                                                                                                                                        Java

                                                                                                                                                                                        • 异或
                                                                                                                                                                                        class Solution {
                                                                                                                                                                                            public int missingNumber(int[] nums) {
                                                                                                                                                                                                int res = nums.length;
                                                                                                                                                                                                for (int i = 0, n = res; i < n; ++i) {
                                                                                                                                                                                                    res ^= (i ^ nums[i]);
                                                                                                                                                                                                }
                                                                                                                                                                                                return res;
                                                                                                                                                                                            }
                                                                                                                                                                                        }
                                                                                                                                                                                        
                                                                                                                                                                                        • 1
                                                                                                                                                                                        • 2
                                                                                                                                                                                        • 3
                                                                                                                                                                                        • 4
                                                                                                                                                                                        • 5
                                                                                                                                                                                        • 6
                                                                                                                                                                                        • 7
                                                                                                                                                                                        • 8
                                                                                                                                                                                        • 9
                                                                                                                                                                                        • 数学
                                                                                                                                                                                        class Solution {
                                                                                                                                                                                            public int missingNumber(int[] nums) {
                                                                                                                                                                                                int res = nums.length;
                                                                                                                                                                                                for (int i = 0, n = res; i < n; ++i) {
                                                                                                                                                                                                    res += (i - nums[i]);
                                                                                                                                                                                                }
                                                                                                                                                                                                return res;
                                                                                                                                                                                            }
                                                                                                                                                                                        }
                                                                                                                                                                                        
                                                                                                                                                                                        • 1
                                                                                                                                                                                        • 2
                                                                                                                                                                                        • 3
                                                                                                                                                                                        • 4
                                                                                                                                                                                        • 5
                                                                                                                                                                                        • 6
                                                                                                                                                                                        • 7
                                                                                                                                                                                        • 8
                                                                                                                                                                                        • 9

                                                                                                                                                                                        273. 整数转换英文表示

                                                                                                                                                                                        题目描述

                                                                                                                                                                                        将非负整数转换为其对应的英文表示。可以保证给定输入小于 231 - 1 。

                                                                                                                                                                                        示例 1:

                                                                                                                                                                                        输入: 123
                                                                                                                                                                                        输出: "One Hundred Twenty Three"
                                                                                                                                                                                        

                                                                                                                                                                                        示例 2:

                                                                                                                                                                                        输入: 12345
                                                                                                                                                                                        输出: "Twelve Thousand Three Hundred Forty Five"

                                                                                                                                                                                        示例 3:

                                                                                                                                                                                        输入: 1234567
                                                                                                                                                                                        输出: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"

                                                                                                                                                                                        示例 4:

                                                                                                                                                                                        输入: 1234567891
                                                                                                                                                                                        输出: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"

                                                                                                                                                                                        解法

                                                                                                                                                                                        Java

                                                                                                                                                                                        class Solution {
                                                                                                                                                                                            private static Map<Integer, String> map;
                                                                                                                                                                                            static {
                                                                                                                                                                                                map = new HashMap<>();
                                                                                                                                                                                                map.put(1, "One");
                                                                                                                                                                                                map.put(2, "Two");
                                                                                                                                                                                                map.put(3, "Three");
                                                                                                                                                                                                map.put(4, "Four");
                                                                                                                                                                                                map.put(5, "Five");
                                                                                                                                                                                                map.put(6, "Six");
                                                                                                                                                                                                map.put(7, "Seven");
                                                                                                                                                                                                map.put(8, "Eight");
                                                                                                                                                                                                map.put(9, "Nine");
                                                                                                                                                                                                map.put(10, "Ten");
                                                                                                                                                                                                map.put(11, "Eleven");
                                                                                                                                                                                                map.put(12, "Twelve");
                                                                                                                                                                                                map.put(13, "Thirteen");
                                                                                                                                                                                                map.put(14, "Fourteen");
                                                                                                                                                                                                map.put(15, "Fifteen");
                                                                                                                                                                                                map.put(16, "Sixteen");
                                                                                                                                                                                                map.put(17, "Seventeen");
                                                                                                                                                                                                map.put(18, "Eighteen");
                                                                                                                                                                                                map.put(19, "Nineteen");
                                                                                                                                                                                                map.put(20, "Twenty");
                                                                                                                                                                                                map.put(30, "Thirty");
                                                                                                                                                                                                map.put(40, "Forty");
                                                                                                                                                                                                map.put(50, "Fifty");
                                                                                                                                                                                                map.put(60, "Sixty");
                                                                                                                                                                                                map.put(70, "Seventy");
                                                                                                                                                                                                map.put(80, "Eighty");
                                                                                                                                                                                                map.put(90, "Ninety");
                                                                                                                                                                                                map.put(100, "Hundred");
                                                                                                                                                                                                map.put(1000, "Thousand");
                                                                                                                                                                                                map.put(1000000, "Million");
                                                                                                                                                                                                map.put(1000000000, "Billion");
                                                                                                                                                                                            }
                                                                                                                                                                                            public String numberToWords(int num) {
                                                                                                                                                                                                if (num == 0) {
                                                                                                                                                                                                    return "Zero";
                                                                                                                                                                                                }
                                                                                                                                                                                                StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                for (int i = 1000000000; i >= 1000; i /= 1000) {
                                                                                                                                                                                                    if (num >= i) {
                                                                                                                                                                                                        sb.append(get3Digits(num / i)).append(' ').append(map.get(i));
                                                                                                                                                                                                        num %= i;
                                                                                                                                                                                                    }
                                                                                                                                                                                                }
                                                                                                                                                                                                if (num > 0) {
                                                                                                                                                                                                    sb.append(get3Digits(num));
                                                                                                                                                                                                }
                                                                                                                                                                                                return sb.substring(1);
                                                                                                                                                                                            }
                                                                                                                                                                                            private String get3Digits(int num) {
                                                                                                                                                                                                StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                if (num >= 100) {
                                                                                                                                                                                                    sb.append(' ').append(map.get(num / 100)).append(' ').append(map.get(100));
                                                                                                                                                                                                    num %= 100;
                                                                                                                                                                                                }
                                                                                                                                                                                                if (num > 0) {
                                                                                                                                                                                                    if (num < 20 || num % 10 == 0) {
                                                                                                                                                                                                        sb.append(' ').append(map.get(num));
                                                                                                                                                                                                    } else {
                                                                                                                                                                                                        sb.append(' ').append(map.get(num / 10 * 10)).append(' ').append(map.get(num % 10));
                                                                                                                                                                                                    }
                                                                                                                                                                                                }
                                                                                                                                                                                                return sb.toString();
                                                                                                                                                                                            }
                                                                                                                                                                                        }
                                                                                                                                                                                        
                                                                                                                                                                                        • 1
                                                                                                                                                                                        • 2
                                                                                                                                                                                        • 3
                                                                                                                                                                                        • 4
                                                                                                                                                                                        • 5
                                                                                                                                                                                        • 6
                                                                                                                                                                                        • 7
                                                                                                                                                                                        • 8
                                                                                                                                                                                        • 9
                                                                                                                                                                                        • 10
                                                                                                                                                                                        • 11
                                                                                                                                                                                        • 12
                                                                                                                                                                                        • 13
                                                                                                                                                                                        • 14
                                                                                                                                                                                        • 15
                                                                                                                                                                                        • 16
                                                                                                                                                                                        • 17
                                                                                                                                                                                        • 18
                                                                                                                                                                                        • 19
                                                                                                                                                                                        • 20
                                                                                                                                                                                        • 21
                                                                                                                                                                                        • 22
                                                                                                                                                                                        • 23
                                                                                                                                                                                        • 24
                                                                                                                                                                                        • 25
                                                                                                                                                                                        • 26
                                                                                                                                                                                        • 27
                                                                                                                                                                                        • 28
                                                                                                                                                                                        • 29
                                                                                                                                                                                        • 30
                                                                                                                                                                                        • 31
                                                                                                                                                                                        • 32
                                                                                                                                                                                        • 33
                                                                                                                                                                                        • 34
                                                                                                                                                                                        • 35
                                                                                                                                                                                        • 36
                                                                                                                                                                                        • 37
                                                                                                                                                                                        • 38
                                                                                                                                                                                        • 39
                                                                                                                                                                                        • 40
                                                                                                                                                                                        • 41
                                                                                                                                                                                        • 42
                                                                                                                                                                                        • 43
                                                                                                                                                                                        • 44
                                                                                                                                                                                        • 45
                                                                                                                                                                                        • 46
                                                                                                                                                                                        • 47
                                                                                                                                                                                        • 48
                                                                                                                                                                                        • 49
                                                                                                                                                                                        • 50
                                                                                                                                                                                        • 51
                                                                                                                                                                                        • 52
                                                                                                                                                                                        • 53
                                                                                                                                                                                        • 54
                                                                                                                                                                                        • 55
                                                                                                                                                                                        • 56
                                                                                                                                                                                        • 57
                                                                                                                                                                                        • 58
                                                                                                                                                                                        • 59
                                                                                                                                                                                        • 60
                                                                                                                                                                                        • 61
                                                                                                                                                                                        • 62
                                                                                                                                                                                        • 63
                                                                                                                                                                                        • 64
                                                                                                                                                                                        • 65
                                                                                                                                                                                        • 66
                                                                                                                                                                                        • 67
                                                                                                                                                                                        • 68

                                                                                                                                                                                        274. H 指数

                                                                                                                                                                                        题目描述

                                                                                                                                                                                        给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 指数。

                                                                                                                                                                                        h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)”

                                                                                                                                                                                         

                                                                                                                                                                                        示例:

                                                                                                                                                                                        输入: citations = [3,0,6,1,5]
                                                                                                                                                                                        输出: 3 
                                                                                                                                                                                        解释: 给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
                                                                                                                                                                                             由于研究者有 3 篇论文每篇至少被引用了 3 次,其余两篇论文每篇被引用不多于 3 次,所以她的 h 指数是 3

                                                                                                                                                                                                       

                                                                                                                                                                                                      说明: 如果 h 有多种可能的值,h 指数是其中最大的那个。

                                                                                                                                                                                                      解法

                                                                                                                                                                                                      Java

                                                                                                                                                                                                      class Solution {
                                                                                                                                                                                                          public int hIndex(int[] citations) {
                                                                                                                                                                                                              int n = citations.length;
                                                                                                                                                                                                              int[] cnt = new int[n + 1];
                                                                                                                                                                                                              for (int c : citations) {
                                                                                                                                                                                                                  if (c <= n) {
                                                                                                                                                                                                                      ++cnt[c];
                                                                                                                                                                                                                  } else {
                                                                                                                                                                                                                      ++cnt[n];
                                                                                                                                                                                                                  }
                                                                                                                                                                                                              }
                                                                                                                                                                                                              int sum = 0;
                                                                                                                                                                                                              for (int i = n; i >= 0; --i) {
                                                                                                                                                                                                                  sum += cnt[i];
                                                                                                                                                                                                                  if (sum >= i) {
                                                                                                                                                                                                                      return i;
                                                                                                                                                                                                                  }
                                                                                                                                                                                                              }
                                                                                                                                                                                                              return 0;
                                                                                                                                                                                                          }
                                                                                                                                                                                                      }
                                                                                                                                                                                                      
                                                                                                                                                                                                      • 1
                                                                                                                                                                                                      • 2
                                                                                                                                                                                                      • 3
                                                                                                                                                                                                      • 4
                                                                                                                                                                                                      • 5
                                                                                                                                                                                                      • 6
                                                                                                                                                                                                      • 7
                                                                                                                                                                                                      • 8
                                                                                                                                                                                                      • 9
                                                                                                                                                                                                      • 10
                                                                                                                                                                                                      • 11
                                                                                                                                                                                                      • 12
                                                                                                                                                                                                      • 13
                                                                                                                                                                                                      • 14
                                                                                                                                                                                                      • 15
                                                                                                                                                                                                      • 16
                                                                                                                                                                                                      • 17
                                                                                                                                                                                                      • 18
                                                                                                                                                                                                      • 19
                                                                                                                                                                                                      • 20
                                                                                                                                                                                                      • 21

                                                                                                                                                                                                      275. H 指数 II

                                                                                                                                                                                                      题目描述

                                                                                                                                                                                                      给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 h 指数。

                                                                                                                                                                                                      h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)"

                                                                                                                                                                                                       

                                                                                                                                                                                                      示例:

                                                                                                                                                                                                      输入: citations = [0,1,3,5,6]
                                                                                                                                                                                                      输出: 3 
                                                                                                                                                                                                      解释: 给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。
                                                                                                                                                                                                           由于研究者有 3 篇论文每篇至少被引用了 3 次,其余两篇论文每篇被引用不多于 3 次,所以她的 h 指数是 3

                                                                                                                                                                                                                     

                                                                                                                                                                                                                    说明:

                                                                                                                                                                                                                    如果 h 有多有种可能的值 ,h 指数是其中最大的那个。

                                                                                                                                                                                                                     

                                                                                                                                                                                                                    进阶:

                                                                                                                                                                                                                    • 这是 H指数 的延伸题目,本题中的 citations 数组是保证有序的。
                                                                                                                                                                                                                    • 你可以优化你的算法到对数时间复杂度吗?

                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                        public int hIndex(int[] citations) {
                                                                                                                                                                                                                            int n = citations.length;
                                                                                                                                                                                                                            int l = 0, r = n;
                                                                                                                                                                                                                            while (l < r) {
                                                                                                                                                                                                                                int mid = l + r + 1 >>> 1;
                                                                                                                                                                                                                                if (citations[n - mid] >= mid) l = mid;
                                                                                                                                                                                                                                else r = mid - 1;
                                                                                                                                                                                                                            }
                                                                                                                                                                                                                            return r;
                                                                                                                                                                                                                        }
                                                                                                                                                                                                                    } 
                                                                                                                                                                                                                    
                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                    • 12

                                                                                                                                                                                                                    278. 第一个错误的版本

                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                    你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

                                                                                                                                                                                                                    假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

                                                                                                                                                                                                                    你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                    给定 n = 5,并且 version = 4 是第一个错误的版本。
                                                                                                                                                                                                                    调用 isBadVersion(3) -> false
                                                                                                                                                                                                                    调用 isBadVersion(5) -> true
                                                                                                                                                                                                                    调用 isBadVersion(4) -> true
                                                                                                                                                                                                                    所以,4 是第一个错误的版本。 
                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                    • 3

                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                    二分查找。

                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                    /* The isBadVersion API is defined in the parent class VersionControl.
                                                                                                                                                                                                                          boolean isBadVersion(int version); */
                                                                                                                                                                                                                    public class Solution extends VersionControl {
                                                                                                                                                                                                                        public int firstBadVersion(int n) {
                                                                                                                                                                                                                            int low = 1, high = n;
                                                                                                                                                                                                                            while (low < high) {
                                                                                                                                                                                                                                int mid = low + ((high - low) >> 1);
                                                                                                                                                                                                                                if (isBadVersion(mid)) high = mid;
                                                                                                                                                                                                                                else low = mid + 1;
                                                                                                                                                                                                                            }
                                                                                                                                                                                                                            return low;
                                                                                                                                                                                                                        }
                                                                                                                                                                                                                    }
                                                                                                                                                                                                                    
                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                    • 13

                                                                                                                                                                                                                    279. 完全平方数

                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                    输入: n = 12
                                                                                                                                                                                                                    输出: 3 
                                                                                                                                                                                                                    解释: 12 = 4 + 4 + 4.

                                                                                                                                                                                                                        示例 2:

                                                                                                                                                                                                                        输入: n = 13
                                                                                                                                                                                                                        输出: 2
                                                                                                                                                                                                                        解释: 13 = 4 + 9.

                                                                                                                                                                                                                            解法

                                                                                                                                                                                                                            Java

                                                                                                                                                                                                                            class Solution {
                                                                                                                                                                                                                            	public int numSquares(int n) {
                                                                                                                                                                                                                            		List<Integer> ans = new ArrayList<>();
                                                                                                                                                                                                                            		ans.add(0);
                                                                                                                                                                                                                            		while (ans.size() <= n) {
                                                                                                                                                                                                                            			int m = ans.size(), val = Integer.MAX_VALUE;
                                                                                                                                                                                                                            			for (int i = 1; i * i <= m; i++) {
                                                                                                                                                                                                                            				val = Math.min(val, ans.get(m - i * i) + 1);
                                                                                                                                                                                                                            			}
                                                                                                                                                                                                                            			ans.add(val);
                                                                                                                                                                                                                            		}
                                                                                                                                                                                                                            		return ans.get(n);
                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                            }
                                                                                                                                                                                                                            
                                                                                                                                                                                                                            • 1
                                                                                                                                                                                                                            • 2
                                                                                                                                                                                                                            • 3
                                                                                                                                                                                                                            • 4
                                                                                                                                                                                                                            • 5
                                                                                                                                                                                                                            • 6
                                                                                                                                                                                                                            • 7
                                                                                                                                                                                                                            • 8
                                                                                                                                                                                                                            • 9
                                                                                                                                                                                                                            • 10
                                                                                                                                                                                                                            • 11
                                                                                                                                                                                                                            • 12
                                                                                                                                                                                                                            • 13
                                                                                                                                                                                                                            • 14

                                                                                                                                                                                                                            283. 移动零

                                                                                                                                                                                                                            题目描述

                                                                                                                                                                                                                            给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

                                                                                                                                                                                                                            示例:

                                                                                                                                                                                                                            输入: [0,1,0,3,12]
                                                                                                                                                                                                                            输出: [1,3,12,0,0]

                                                                                                                                                                                                                                说明:

                                                                                                                                                                                                                                1. 必须在原数组上操作,不能拷贝额外的数组。
                                                                                                                                                                                                                                2. 尽量减少操作次数。

                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                    public void moveZeroes(int[] nums) {
                                                                                                                                                                                                                                        int n;
                                                                                                                                                                                                                                        if (nums == null || (n = nums.length) < 1) {
                                                                                                                                                                                                                                            return;
                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                        int zeroCount = 0;
                                                                                                                                                                                                                                        for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                            if (nums[i] == 0) {
                                                                                                                                                                                                                                                ++zeroCount;
                                                                                                                                                                                                                                            } else {
                                                                                                                                                                                                                                                nums[i - zeroCount] = nums[i];
                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                        while (zeroCount > 0) {
                                                                                                                                                                                                                                            nums[n - zeroCount--] = 0;
                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                
                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                • 19

                                                                                                                                                                                                                                284. 顶端迭代器

                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。

                                                                                                                                                                                                                                示例:

                                                                                                                                                                                                                                假设迭代器被初始化为列表 [1,2,3]
                                                                                                                                                                                                                                  。 调用 next()
                                                                                                                                                                                                                                    返回 1,得到列表中的第一个元素。 现在调用 peek()
                                                                                                                                                                                                                                       返回 2,下一个元素。在此之后调用 next()
                                                                                                                                                                                                                                        仍然返回 2。 最后一次调用 next()
                                                                                                                                                                                                                                           返回 3,末尾元素。在此之后调用 hasNext()
                                                                                                                                                                                                                                             应该返回 false

                                                                                                                                                                                                                                            进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?

                                                                                                                                                                                                                                            解法

                                                                                                                                                                                                                                            Java

                                                                                                                                                                                                                                            // Java Iterator interface reference:
                                                                                                                                                                                                                                            // https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
                                                                                                                                                                                                                                            class PeekingIterator implements Iterator<Integer> {
                                                                                                                                                                                                                                            	private Iterator<Integer> iterator;
                                                                                                                                                                                                                                            	private boolean hasPeeked;
                                                                                                                                                                                                                                            	private Integer peekedElement;
                                                                                                                                                                                                                                            	public PeekingIterator(Iterator<Integer> iterator) {
                                                                                                                                                                                                                                            		// initialize any member here.
                                                                                                                                                                                                                                            		this.iterator = iterator;
                                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                                            	// Returns the next element in the iteration without advancing the iterator.
                                                                                                                                                                                                                                            	public Integer peek() {
                                                                                                                                                                                                                                            		if (!hasPeeked) {
                                                                                                                                                                                                                                            			peekedElement = iterator.next();
                                                                                                                                                                                                                                            			hasPeeked = true;
                                                                                                                                                                                                                                            		}
                                                                                                                                                                                                                                            		return peekedElement;
                                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                                            	// hasNext() and next() should behave the same as in the Iterator interface.
                                                                                                                                                                                                                                            	// Override them if needed.
                                                                                                                                                                                                                                            	public Integer next() {
                                                                                                                                                                                                                                            		if (!hasPeeked) {
                                                                                                                                                                                                                                            			return iterator.next();
                                                                                                                                                                                                                                            		}
                                                                                                                                                                                                                                            		Integer result = peekedElement;
                                                                                                                                                                                                                                            		hasPeeked = false;
                                                                                                                                                                                                                                            		peekedElement = null;
                                                                                                                                                                                                                                            		return result;
                                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                                            	public boolean hasNext() {
                                                                                                                                                                                                                                            		return hasPeeked || iterator.hasNext();
                                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                            • 1
                                                                                                                                                                                                                                            • 2
                                                                                                                                                                                                                                            • 3
                                                                                                                                                                                                                                            • 4
                                                                                                                                                                                                                                            • 5
                                                                                                                                                                                                                                            • 6
                                                                                                                                                                                                                                            • 7
                                                                                                                                                                                                                                            • 8
                                                                                                                                                                                                                                            • 9
                                                                                                                                                                                                                                            • 10
                                                                                                                                                                                                                                            • 11
                                                                                                                                                                                                                                            • 12
                                                                                                                                                                                                                                            • 13
                                                                                                                                                                                                                                            • 14
                                                                                                                                                                                                                                            • 15
                                                                                                                                                                                                                                            • 16
                                                                                                                                                                                                                                            • 17
                                                                                                                                                                                                                                            • 18
                                                                                                                                                                                                                                            • 19
                                                                                                                                                                                                                                            • 20
                                                                                                                                                                                                                                            • 21
                                                                                                                                                                                                                                            • 22
                                                                                                                                                                                                                                            • 23
                                                                                                                                                                                                                                            • 24
                                                                                                                                                                                                                                            • 25
                                                                                                                                                                                                                                            • 26
                                                                                                                                                                                                                                            • 27
                                                                                                                                                                                                                                            • 28
                                                                                                                                                                                                                                            • 29
                                                                                                                                                                                                                                            • 30
                                                                                                                                                                                                                                            • 31
                                                                                                                                                                                                                                            • 32
                                                                                                                                                                                                                                            • 33

                                                                                                                                                                                                                                            287. 寻找重复数

                                                                                                                                                                                                                                            题目描述

                                                                                                                                                                                                                                            给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

                                                                                                                                                                                                                                            示例 1:

                                                                                                                                                                                                                                            输入: [1,3,4,2,2]
                                                                                                                                                                                                                                            输出: 2
                                                                                                                                                                                                                                            

                                                                                                                                                                                                                                              示例 2:

                                                                                                                                                                                                                                              输入: [3,1,3,4,2]
                                                                                                                                                                                                                                              输出: 3
                                                                                                                                                                                                                                              

                                                                                                                                                                                                                                              说明:

                                                                                                                                                                                                                                              1. 不能更改原数组(假设数组是只读的)。
                                                                                                                                                                                                                                              2. 只能使用额外的 O(1) 的空间。
                                                                                                                                                                                                                                              3. 时间复杂度小于 O(n2) 。
                                                                                                                                                                                                                                              4. 数组中只有一个重复的数字,但它可能不止重复出现一次。

                                                                                                                                                                                                                                              解法

                                                                                                                                                                                                                                              Java

                                                                                                                                                                                                                                              public class Solution {
                                                                                                                                                                                                                                                  // https://segmentfault.com/a/1190000003817671
                                                                                                                                                                                                                                                  public int findDuplicate(int[] nums) {
                                                                                                                                                                                                                                                      int slow = 0;
                                                                                                                                                                                                                                                      int fast = 0;
                                                                                                                                                                                                                                                      // 找到快慢指针相遇的地方
                                                                                                                                                                                                                                                      do{
                                                                                                                                                                                                                                                          slow = nums[slow];
                                                                                                                                                                                                                                                          fast = nums[nums[fast]];
                                                                                                                                                                                                                                                      } while(slow != fast);
                                                                                                                                                                                                                                                      int find = 0;
                                                                                                                                                                                                                                                      // 用一个新指针从头开始,直到和慢指针相遇
                                                                                                                                                                                                                                                      while(find != slow){
                                                                                                                                                                                                                                                          slow = nums[slow];
                                                                                                                                                                                                                                                          find = nums[find];
                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                      return find;
                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                              • 1
                                                                                                                                                                                                                                              • 2
                                                                                                                                                                                                                                              • 3
                                                                                                                                                                                                                                              • 4
                                                                                                                                                                                                                                              • 5
                                                                                                                                                                                                                                              • 6
                                                                                                                                                                                                                                              • 7
                                                                                                                                                                                                                                              • 8
                                                                                                                                                                                                                                              • 9
                                                                                                                                                                                                                                              • 10
                                                                                                                                                                                                                                              • 11
                                                                                                                                                                                                                                              • 12
                                                                                                                                                                                                                                              • 13
                                                                                                                                                                                                                                              • 14
                                                                                                                                                                                                                                              • 15
                                                                                                                                                                                                                                              • 16
                                                                                                                                                                                                                                              • 17
                                                                                                                                                                                                                                              • 18
                                                                                                                                                                                                                                              • 19

                                                                                                                                                                                                                                              289. 生命游戏

                                                                                                                                                                                                                                              题目描述

                                                                                                                                                                                                                                              根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

                                                                                                                                                                                                                                              给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

                                                                                                                                                                                                                                              1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
                                                                                                                                                                                                                                              2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
                                                                                                                                                                                                                                              3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
                                                                                                                                                                                                                                              4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

                                                                                                                                                                                                                                              根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

                                                                                                                                                                                                                                              示例:

                                                                                                                                                                                                                                              输入: 
                                                                                                                                                                                                                                              [
                                                                                                                                                                                                                                                [0,1,0],
                                                                                                                                                                                                                                                [0,0,1],
                                                                                                                                                                                                                                                [1,1,1],
                                                                                                                                                                                                                                                [0,0,0]
                                                                                                                                                                                                                                              ]
                                                                                                                                                                                                                                              输出: 
                                                                                                                                                                                                                                              [
                                                                                                                                                                                                                                                [0,0,0],
                                                                                                                                                                                                                                                [1,0,1],
                                                                                                                                                                                                                                                [0,1,1],
                                                                                                                                                                                                                                                [0,1,0]
                                                                                                                                                                                                                                              ]

                                                                                                                                                                                                                                              进阶:

                                                                                                                                                                                                                                              • 你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
                                                                                                                                                                                                                                              • 本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

                                                                                                                                                                                                                                              解法

                                                                                                                                                                                                                                              Java

                                                                                                                                                                                                                                              class Solution {
                                                                                                                                                                                                                                                  public void gameOfLife(int[][] board) {
                                                                                                                                                                                                                                              		final int m = board.length;
                                                                                                                                                                                                                                              		final int n = board[0].length;
                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                      /**
                                                                                                                                                                                                                                                          状态0:死细胞转为死细胞
                                                                                                                                                                                                                                                          状态1:活细胞转为活细胞
                                                                                                                                                                                                                                                          状态2:活细胞转为死细胞
                                                                                                                                                                                                                                                          状态3:死细胞转为活细胞
                                                                                                                                                                                                                                                      **/
                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                              		// encode
                                                                                                                                                                                                                                              		for (int i = 0; i < m; ++i) {
                                                                                                                                                                                                                                              			for (int j = 0; j < n; ++j) {
                                                                                                                                                                                                                                              				int live = countLive(board, i, j); // number of live cells
                                                                                                                                                                                                                                              				if (board[i][j] == 0 && live == 3) {
                                                                                                                                                                                                                                              					board[i][j] = 3;
                                                                                                                                                                                                                                              				} else if (board[i][j] == 1 && (live < 2 || live > 3)) {
                                                                                                                                                                                                                                              					board[i][j] = 2;
                                                                                                                                                                                                                                              				}
                                                                                                                                                                                                                                              			}
                                                                                                                                                                                                                                              		}
                                                                                                                                                                                                                                              		// decode
                                                                                                                                                                                                                                              		for (int i = 0; i < m; ++i) {
                                                                                                                                                                                                                                              			for (int j = 0; j < n; ++j) {
                                                                                                                                                                                                                                              				board[i][j] %= 2;
                                                                                                                                                                                                                                              			}
                                                                                                                                                                                                                                              		}
                                                                                                                                                                                                                                              	}
                                                                                                                                                                                                                                              	
                                                                                                                                                                                                                                              	private int countLive(int[][] nums, int i, int j) {
                                                                                                                                                                                                                                                      int count = 0;
                                                                                                                                                                                                                                                      int m = nums.length, n = nums[0].length;
                                                                                                                                                                                                                                                      for(int x = i - 1; x <= i + 1; x++) {
                                                                                                                                                                                                                                                          for(int y = j - 1; y <= j + 1; y++) {
                                                                                                                                                                                                                                                              if(x == i && y == j) continue;
                                                                                                                                                                                                                                                              if(x >= 0 && x < m && y >= 0 && y < n && (nums[x][y] == 1 || nums[x][y] == 2)) {
                                                                                                                                                                                                                                                                  count++;
                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                      return count;
                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                              • 1
                                                                                                                                                                                                                                              • 2
                                                                                                                                                                                                                                              • 3
                                                                                                                                                                                                                                              • 4
                                                                                                                                                                                                                                              • 5
                                                                                                                                                                                                                                              • 6
                                                                                                                                                                                                                                              • 7
                                                                                                                                                                                                                                              • 8
                                                                                                                                                                                                                                              • 9
                                                                                                                                                                                                                                              • 10
                                                                                                                                                                                                                                              • 11
                                                                                                                                                                                                                                              • 12
                                                                                                                                                                                                                                              • 13
                                                                                                                                                                                                                                              • 14
                                                                                                                                                                                                                                              • 15
                                                                                                                                                                                                                                              • 16
                                                                                                                                                                                                                                              • 17
                                                                                                                                                                                                                                              • 18
                                                                                                                                                                                                                                              • 19
                                                                                                                                                                                                                                              • 20
                                                                                                                                                                                                                                              • 21
                                                                                                                                                                                                                                              • 22
                                                                                                                                                                                                                                              • 23
                                                                                                                                                                                                                                              • 24
                                                                                                                                                                                                                                              • 25
                                                                                                                                                                                                                                              • 26
                                                                                                                                                                                                                                              • 27
                                                                                                                                                                                                                                              • 28
                                                                                                                                                                                                                                              • 29
                                                                                                                                                                                                                                              • 30
                                                                                                                                                                                                                                              • 31
                                                                                                                                                                                                                                              • 32
                                                                                                                                                                                                                                              • 33
                                                                                                                                                                                                                                              • 34
                                                                                                                                                                                                                                              • 35
                                                                                                                                                                                                                                              • 36
                                                                                                                                                                                                                                              • 37
                                                                                                                                                                                                                                              • 38
                                                                                                                                                                                                                                              • 39
                                                                                                                                                                                                                                              • 40
                                                                                                                                                                                                                                              • 41
                                                                                                                                                                                                                                              • 42
                                                                                                                                                                                                                                              • 43
                                                                                                                                                                                                                                              • 44
                                                                                                                                                                                                                                              • 45

                                                                                                                                                                                                                                              290. 单词规律

                                                                                                                                                                                                                                              题目描述

                                                                                                                                                                                                                                              给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

                                                                                                                                                                                                                                              这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

                                                                                                                                                                                                                                              示例1:

                                                                                                                                                                                                                                              输入: pattern = "abba", str = "dog cat cat dog"
                                                                                                                                                                                                                                              输出: true

                                                                                                                                                                                                                                                  示例 2:

                                                                                                                                                                                                                                                  输入:pattern = "abba", str = "dog cat cat fish"
                                                                                                                                                                                                                                                  输出: false

                                                                                                                                                                                                                                                      示例 3:

                                                                                                                                                                                                                                                      输入: pattern = "aaaa", str = "dog cat cat dog"
                                                                                                                                                                                                                                                      输出: false

                                                                                                                                                                                                                                                          示例 4:

                                                                                                                                                                                                                                                          输入: pattern = "abba", str = "dog dog dog dog"
                                                                                                                                                                                                                                                          输出: false

                                                                                                                                                                                                                                                              说明:
                                                                                                                                                                                                                                                              你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。    

                                                                                                                                                                                                                                                              解法

                                                                                                                                                                                                                                                              Java

                                                                                                                                                                                                                                                              class Solution {
                                                                                                                                                                                                                                                                  public boolean wordPattern(String pattern, String s) {
                                                                                                                                                                                                                                                                      Map<Character, String> ch2str = new HashMap<>();
                                                                                                                                                                                                                                                                      Map<String, Character> str2ch = new HashMap<>();
                                                                                                                                                                                                                                                                      String[] ss = s.split(" ");
                                                                                                                                                                                                                                                                      int n = pattern.length();
                                                                                                                                                                                                                                                                      if (n != ss.length) {
                                                                                                                                                                                                                                                                          return false;
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                      for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                          char ch = pattern.charAt(i);
                                                                                                                                                                                                                                                                          if (ch2str.containsKey(ch) && !ch2str.get(ch).equals(ss[i])) {
                                                                                                                                                                                                                                                                              return false;
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          if (str2ch.containsKey(ss[i]) && !str2ch.get(ss[i]).equals(ch)) {
                                                                                                                                                                                                                                                                              return false;
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          ch2str.put(ch, ss[i]);
                                                                                                                                                                                                                                                                          str2ch.put(ss[i], ch);
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                      return true;
                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                              • 1
                                                                                                                                                                                                                                                              • 2
                                                                                                                                                                                                                                                              • 3
                                                                                                                                                                                                                                                              • 4
                                                                                                                                                                                                                                                              • 5
                                                                                                                                                                                                                                                              • 6
                                                                                                                                                                                                                                                              • 7
                                                                                                                                                                                                                                                              • 8
                                                                                                                                                                                                                                                              • 9
                                                                                                                                                                                                                                                              • 10
                                                                                                                                                                                                                                                              • 11
                                                                                                                                                                                                                                                              • 12
                                                                                                                                                                                                                                                              • 13
                                                                                                                                                                                                                                                              • 14
                                                                                                                                                                                                                                                              • 15
                                                                                                                                                                                                                                                              • 16
                                                                                                                                                                                                                                                              • 17
                                                                                                                                                                                                                                                              • 18
                                                                                                                                                                                                                                                              • 19
                                                                                                                                                                                                                                                              • 20
                                                                                                                                                                                                                                                              • 21
                                                                                                                                                                                                                                                              • 22
                                                                                                                                                                                                                                                              • 23

                                                                                                                                                                                                                                                              292. Nim 游戏

                                                                                                                                                                                                                                                              题目描述

                                                                                                                                                                                                                                                              你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

                                                                                                                                                                                                                                                              你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

                                                                                                                                                                                                                                                              示例:

                                                                                                                                                                                                                                                              输入: 4
                                                                                                                                                                                                                                                              输出: false 
                                                                                                                                                                                                                                                              解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
                                                                                                                                                                                                                                                                   因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
                                                                                                                                                                                                                                                              

                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                    public boolean canWinNim(int n) {
                                                                                                                                                                                                                                                                        return (n & 3) != 0;// n%4 != 0
                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                • 5

                                                                                                                                                                                                                                                                293. 翻转游戏

                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 +- 的字符串。你和朋友轮流将 连续 的两个 "++" 反转成 "--"。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。

                                                                                                                                                                                                                                                                请你写出一个函数,来计算出第一次翻转后,字符串所有的可能状态。

                                                                                                                                                                                                                                                                示例:

                                                                                                                                                                                                                                                                输入: s = "++++"
                                                                                                                                                                                                                                                                输出: 
                                                                                                                                                                                                                                                                [
                                                                                                                                                                                                                                                                  "--++",
                                                                                                                                                                                                                                                                  "+--+",
                                                                                                                                                                                                                                                                  "++--"
                                                                                                                                                                                                                                                                ]
                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                  注意:如果不存在可能的有效操作,请返回一个空列表 []

                                                                                                                                                                                                                                                                  解法

                                                                                                                                                                                                                                                                  Java

                                                                                                                                                                                                                                                                  class Solution {
                                                                                                                                                                                                                                                                      public List<String> generatePossibleNextMoves(String s) {
                                                                                                                                                                                                                                                                          int n;
                                                                                                                                                                                                                                                                          if (s == null || (n = s.length()) < 2) return Collections.emptyList();
                                                                                                                                                                                                                                                                          List<String> res = new ArrayList<>();
                                                                                                                                                                                                                                                                          for (int i = 0; i < n - 1; ++i) {
                                                                                                                                                                                                                                                                              if (s.charAt(i) == '+' && s.charAt(i + 1) == '+') {
                                                                                                                                                                                                                                                                                  StringBuilder sb = new StringBuilder(s);
                                                                                                                                                                                                                                                                                  sb.replace(i, i + 2, "--");
                                                                                                                                                                                                                                                                                  res.add(sb.toString());
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          return res;
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                  • 1
                                                                                                                                                                                                                                                                  • 2
                                                                                                                                                                                                                                                                  • 3
                                                                                                                                                                                                                                                                  • 4
                                                                                                                                                                                                                                                                  • 5
                                                                                                                                                                                                                                                                  • 6
                                                                                                                                                                                                                                                                  • 7
                                                                                                                                                                                                                                                                  • 8
                                                                                                                                                                                                                                                                  • 9
                                                                                                                                                                                                                                                                  • 10
                                                                                                                                                                                                                                                                  • 11
                                                                                                                                                                                                                                                                  • 12
                                                                                                                                                                                                                                                                  • 13
                                                                                                                                                                                                                                                                  • 14
                                                                                                                                                                                                                                                                  • 15

                                                                                                                                                                                                                                                                  295. 数据流的中位数

                                                                                                                                                                                                                                                                  题目描述

                                                                                                                                                                                                                                                                  中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

                                                                                                                                                                                                                                                                  例如,

                                                                                                                                                                                                                                                                  [2,3,4] 的中位数是 3

                                                                                                                                                                                                                                                                  [2,3] 的中位数是 (2 + 3) / 2 = 2.5

                                                                                                                                                                                                                                                                  设计一个支持以下两种操作的数据结构:

                                                                                                                                                                                                                                                                  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
                                                                                                                                                                                                                                                                  • double findMedian() - 返回目前所有元素的中位数。

                                                                                                                                                                                                                                                                  示例:

                                                                                                                                                                                                                                                                  addNum(1)
                                                                                                                                                                                                                                                                  addNum(2)
                                                                                                                                                                                                                                                                  findMedian() -> 1.5
                                                                                                                                                                                                                                                                  addNum(3) 
                                                                                                                                                                                                                                                                  findMedian() -> 2

                                                                                                                                                                                                                                                                  进阶:

                                                                                                                                                                                                                                                                  1. 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?
                                                                                                                                                                                                                                                                  2. 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?

                                                                                                                                                                                                                                                                  解法

                                                                                                                                                                                                                                                                  Java

                                                                                                                                                                                                                                                                  class MedianFinder {
                                                                                                                                                                                                                                                                      private PriorityQueue<Integer> bigRoot;
                                                                                                                                                                                                                                                                      private PriorityQueue<Integer> smallRoot;
                                                                                                                                                                                                                                                                      /** initialize your data structure here. */
                                                                                                                                                                                                                                                                      public MedianFinder() {
                                                                                                                                                                                                                                                                          bigRoot = new PriorityQueue<>(Comparator.reverseOrder());
                                                                                                                                                                                                                                                                          smallRoot = new PriorityQueue<>(Integer::compareTo);
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                      public void addNum(int num) {
                                                                                                                                                                                                                                                                          if (bigRoot.isEmpty() || bigRoot.peek() > num) {
                                                                                                                                                                                                                                                                              bigRoot.offer(num);
                                                                                                                                                                                                                                                                          } else {
                                                                                                                                                                                                                                                                              smallRoot.offer(num);
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          int size1 = bigRoot.size();
                                                                                                                                                                                                                                                                          int size2 = smallRoot.size();
                                                                                                                                                                                                                                                                          if (size1 - size2 > 1) {
                                                                                                                                                                                                                                                                              smallRoot.offer(bigRoot.poll());
                                                                                                                                                                                                                                                                          } else if (size2 - size1 > 1) {
                                                                                                                                                                                                                                                                              bigRoot.offer(smallRoot.poll());
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                      public double findMedian() {
                                                                                                                                                                                                                                                                          int size1 = bigRoot.size();
                                                                                                                                                                                                                                                                          int size2 = smallRoot.size();
                                                                                                                                                                                                                                                                          return size1 == size2 ? (bigRoot.peek() + smallRoot.peek()) * 1.0 / 2
                                                                                                                                                                                                                                                                                  : (size1 > size2 ? bigRoot.peek() : smallRoot.peek());
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                  /**
                                                                                                                                                                                                                                                                   * Your MedianFinder object will be instantiated and called as such:
                                                                                                                                                                                                                                                                   * MedianFinder obj = new MedianFinder(); 
                                                                                                                                                                                                                                                                   * obj.addNum(num); 
                                                                                                                                                                                                                                                                   * double param_2 = obj.findMedian();
                                                                                                                                                                                                                                                                   */
                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                  • 1
                                                                                                                                                                                                                                                                  • 2
                                                                                                                                                                                                                                                                  • 3
                                                                                                                                                                                                                                                                  • 4
                                                                                                                                                                                                                                                                  • 5
                                                                                                                                                                                                                                                                  • 6
                                                                                                                                                                                                                                                                  • 7
                                                                                                                                                                                                                                                                  • 8
                                                                                                                                                                                                                                                                  • 9
                                                                                                                                                                                                                                                                  • 10
                                                                                                                                                                                                                                                                  • 11
                                                                                                                                                                                                                                                                  • 12
                                                                                                                                                                                                                                                                  • 13
                                                                                                                                                                                                                                                                  • 14
                                                                                                                                                                                                                                                                  • 15
                                                                                                                                                                                                                                                                  • 16
                                                                                                                                                                                                                                                                  • 17
                                                                                                                                                                                                                                                                  • 18
                                                                                                                                                                                                                                                                  • 19
                                                                                                                                                                                                                                                                  • 20
                                                                                                                                                                                                                                                                  • 21
                                                                                                                                                                                                                                                                  • 22
                                                                                                                                                                                                                                                                  • 23
                                                                                                                                                                                                                                                                  • 24
                                                                                                                                                                                                                                                                  • 25
                                                                                                                                                                                                                                                                  • 26
                                                                                                                                                                                                                                                                  • 27
                                                                                                                                                                                                                                                                  • 28
                                                                                                                                                                                                                                                                  • 29
                                                                                                                                                                                                                                                                  • 30
                                                                                                                                                                                                                                                                  • 31
                                                                                                                                                                                                                                                                  • 32
                                                                                                                                                                                                                                                                  • 33
                                                                                                                                                                                                                                                                  • 34
                                                                                                                                                                                                                                                                  • 35

                                                                                                                                                                                                                                                                  297. 二叉树的序列化与反序列化

                                                                                                                                                                                                                                                                  题目描述

                                                                                                                                                                                                                                                                  序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

                                                                                                                                                                                                                                                                  请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

                                                                                                                                                                                                                                                                  示例: 

                                                                                                                                                                                                                                                                  你可以将以下二叉树:
                                                                                                                                                                                                                                                                      1
                                                                                                                                                                                                                                                                     / \
                                                                                                                                                                                                                                                                    2   3
                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                      4   5
                                                                                                                                                                                                                                                                  序列化为 "[1,2,3,null,null,4,5]"

                                                                                                                                                                                                                                                                    提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

                                                                                                                                                                                                                                                                    说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                    public class Codec {
                                                                                                                                                                                                                                                                            public String serialize(TreeNode root) {
                                                                                                                                                                                                                                                                            if (root == null) {
                                                                                                                                                                                                                                                                                return "";
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                            StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                                                                                            Deque<TreeNode> deque = new LinkedList<>();
                                                                                                                                                                                                                                                                            deque.add(root);
                                                                                                                                                                                                                                                                            while (!deque.isEmpty()) {
                                                                                                                                                                                                                                                                                TreeNode p = deque.pop();
                                                                                                                                                                                                                                                                                if (p == null) {
                                                                                                                                                                                                                                                                                    sb.append(",#");
                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                    sb.append(",").append(p.val);
                                                                                                                                                                                                                                                                                    deque.add(p.left);
                                                                                                                                                                                                                                                                                    deque.add(p.right);
                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                            return sb.toString().substring(1);
                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                        public TreeNode deserialize(String data) {
                                                                                                                                                                                                                                                                            if (data == null || Objects.equals(data, "")) {
                                                                                                                                                                                                                                                                                return null;
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                            String[] s = data.split(",");
                                                                                                                                                                                                                                                                            TreeNode[] root = new TreeNode[s.length];
                                                                                                                                                                                                                                                                            for (int i = 0; i < root.length; i++) {
                                                                                                                                                                                                                                                                                if (!Objects.equals(s[i], "#")) {
                                                                                                                                                                                                                                                                                    root[i] = new TreeNode(Integer.valueOf(s[i]));
                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                            int parent = 0;
                                                                                                                                                                                                                                                                            for (int i = 0; parent * 2 + 2 < s.length; i++) {
                                                                                                                                                                                                                                                                                if (root[i] != null) {
                                                                                                                                                                                                                                                                                    root[i].left = root[parent * 2 + 1];
                                                                                                                                                                                                                                                                                    root[i].right = root[parent * 2 + 2];
                                                                                                                                                                                                                                                                                    parent++;
                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                            return root[0];
                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                    // Your Codec object will be instantiated and called as such:
                                                                                                                                                                                                                                                                    // Codec codec = new Codec();
                                                                                                                                                                                                                                                                    // codec.deserialize(codec.serialize(root));
                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                    • 45
                                                                                                                                                                                                                                                                    • 46
                                                                                                                                                                                                                                                                    • 47
                                                                                                                                                                                                                                                                    • 48
                                                                                                                                                                                                                                                                    • 49
                                                                                                                                                                                                                                                                    • 50
                                                                                                                                                                                                                                                                    • 51
                                                                                                                                                                                                                                                                    • 52
                                                                                                                                                                                                                                                                    • 53
                                                                                                                                                                                                                                                                    • 54

                                                                                                                                                                                                                                                                    297. 二叉树的序列化与反序列化

                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

                                                                                                                                                                                                                                                                    请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

                                                                                                                                                                                                                                                                    示例: 

                                                                                                                                                                                                                                                                    你可以将以下二叉树:
                                                                                                                                                                                                                                                                        1
                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                      2   3
                                                                                                                                                                                                                                                                         / \
                                                                                                                                                                                                                                                                        4   5
                                                                                                                                                                                                                                                                    序列化为 "[1,2,3,null,null,4,5]"

                                                                                                                                                                                                                                                                      提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

                                                                                                                                                                                                                                                                      说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

                                                                                                                                                                                                                                                                      解法

                                                                                                                                                                                                                                                                      Java

                                                                                                                                                                                                                                                                      /**
                                                                                                                                                                                                                                                                       * Definition for a binary tree node.
                                                                                                                                                                                                                                                                       * public class TreeNode {
                                                                                                                                                                                                                                                                       *     int val;
                                                                                                                                                                                                                                                                       *     TreeNode left;
                                                                                                                                                                                                                                                                       *     TreeNode right;
                                                                                                                                                                                                                                                                       *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                       * }
                                                                                                                                                                                                                                                                       */
                                                                                                                                                                                                                                                                      public class Codec {
                                                                                                                                                                                                                                                                              public String serialize(TreeNode root) {
                                                                                                                                                                                                                                                                              if (root == null) {
                                                                                                                                                                                                                                                                                  return "";
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                                                                                              Deque<TreeNode> deque = new LinkedList<>();
                                                                                                                                                                                                                                                                              deque.add(root);
                                                                                                                                                                                                                                                                              while (!deque.isEmpty()) {
                                                                                                                                                                                                                                                                                  TreeNode p = deque.pop();
                                                                                                                                                                                                                                                                                  if (p == null) {
                                                                                                                                                                                                                                                                                      sb.append(",#");
                                                                                                                                                                                                                                                                                  } else {
                                                                                                                                                                                                                                                                                      sb.append(",").append(p.val);
                                                                                                                                                                                                                                                                                      deque.add(p.left);
                                                                                                                                                                                                                                                                                      deque.add(p.right);
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              return sb.toString().substring(1);
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          public TreeNode deserialize(String data) {
                                                                                                                                                                                                                                                                              if (data == null || Objects.equals(data, "")) {
                                                                                                                                                                                                                                                                                  return null;
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              String[] s = data.split(",");
                                                                                                                                                                                                                                                                              TreeNode[] root = new TreeNode[s.length];
                                                                                                                                                                                                                                                                              for (int i = 0; i < root.length; i++) {
                                                                                                                                                                                                                                                                                  if (!Objects.equals(s[i], "#")) {
                                                                                                                                                                                                                                                                                      root[i] = new TreeNode(Integer.valueOf(s[i]));
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              int parent = 0;
                                                                                                                                                                                                                                                                              for (int i = 0; parent * 2 + 2 < s.length; i++) {
                                                                                                                                                                                                                                                                                  if (root[i] != null) {
                                                                                                                                                                                                                                                                                      root[i].left = root[parent * 2 + 1];
                                                                                                                                                                                                                                                                                      root[i].right = root[parent * 2 + 2];
                                                                                                                                                                                                                                                                                      parent++;
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              return root[0];
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                      // Your Codec object will be instantiated and called as such:
                                                                                                                                                                                                                                                                      // Codec codec = new Codec();
                                                                                                                                                                                                                                                                      // codec.deserialize(codec.serialize(root));
                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                      • 1
                                                                                                                                                                                                                                                                      • 2
                                                                                                                                                                                                                                                                      • 3
                                                                                                                                                                                                                                                                      • 4
                                                                                                                                                                                                                                                                      • 5
                                                                                                                                                                                                                                                                      • 6
                                                                                                                                                                                                                                                                      • 7
                                                                                                                                                                                                                                                                      • 8
                                                                                                                                                                                                                                                                      • 9
                                                                                                                                                                                                                                                                      • 10
                                                                                                                                                                                                                                                                      • 11
                                                                                                                                                                                                                                                                      • 12
                                                                                                                                                                                                                                                                      • 13
                                                                                                                                                                                                                                                                      • 14
                                                                                                                                                                                                                                                                      • 15
                                                                                                                                                                                                                                                                      • 16
                                                                                                                                                                                                                                                                      • 17
                                                                                                                                                                                                                                                                      • 18
                                                                                                                                                                                                                                                                      • 19
                                                                                                                                                                                                                                                                      • 20
                                                                                                                                                                                                                                                                      • 21
                                                                                                                                                                                                                                                                      • 22
                                                                                                                                                                                                                                                                      • 23
                                                                                                                                                                                                                                                                      • 24
                                                                                                                                                                                                                                                                      • 25
                                                                                                                                                                                                                                                                      • 26
                                                                                                                                                                                                                                                                      • 27
                                                                                                                                                                                                                                                                      • 28
                                                                                                                                                                                                                                                                      • 29
                                                                                                                                                                                                                                                                      • 30
                                                                                                                                                                                                                                                                      • 31
                                                                                                                                                                                                                                                                      • 32
                                                                                                                                                                                                                                                                      • 33
                                                                                                                                                                                                                                                                      • 34
                                                                                                                                                                                                                                                                      • 35
                                                                                                                                                                                                                                                                      • 36
                                                                                                                                                                                                                                                                      • 37
                                                                                                                                                                                                                                                                      • 38
                                                                                                                                                                                                                                                                      • 39
                                                                                                                                                                                                                                                                      • 40
                                                                                                                                                                                                                                                                      • 41
                                                                                                                                                                                                                                                                      • 42
                                                                                                                                                                                                                                                                      • 43
                                                                                                                                                                                                                                                                      • 44
                                                                                                                                                                                                                                                                      • 45
                                                                                                                                                                                                                                                                      • 46
                                                                                                                                                                                                                                                                      • 47
                                                                                                                                                                                                                                                                      • 48
                                                                                                                                                                                                                                                                      • 49
                                                                                                                                                                                                                                                                      • 50
                                                                                                                                                                                                                                                                      • 51
                                                                                                                                                                                                                                                                      • 52
                                                                                                                                                                                                                                                                      • 53
                                                                                                                                                                                                                                                                      • 54

                                                                                                                                                                                                                                                                      300. 最长上升子序列

                                                                                                                                                                                                                                                                      题目描述

                                                                                                                                                                                                                                                                      给定一个无序的整数数组,找到其中最长上升子序列的长度。

                                                                                                                                                                                                                                                                      示例:

                                                                                                                                                                                                                                                                      输入: [10,9,2,5,3,7,101,18]
                                                                                                                                                                                                                                                                      输出: 4 
                                                                                                                                                                                                                                                                      解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4
                                                                                                                                                                                                                                                                      • 1

                                                                                                                                                                                                                                                                          说明:

                                                                                                                                                                                                                                                                          • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
                                                                                                                                                                                                                                                                          • 你算法的时间复杂度应该为 O(n2) 。

                                                                                                                                                                                                                                                                          进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

                                                                                                                                                                                                                                                                          解法

                                                                                                                                                                                                                                                                          动态规划求解。
                                                                                                                                                                                                                                                                          定义 dp[i] 为以 nums[i] 结尾的最长子序列的长度。即题目求的是 dp[i]i ∈[0, n-1])的最大值。
                                                                                                                                                                                                                                                                          状态转移方程为:
                                                                                                                                                                                                                                                                          dp[i] = max(dp[j]) + 1,其中 0≤j<inums[j]<nums[i]

                                                                                                                                                                                                                                                                          Java

                                                                                                                                                                                                                                                                          class Solution {
                                                                                                                                                                                                                                                                              public int lengthOfLIS(int[] nums) {
                                                                                                                                                                                                                                                                                  int n = nums.length;
                                                                                                                                                                                                                                                                                  int[] dp = new int[n];
                                                                                                                                                                                                                                                                                  Arrays.fill(dp, 1);
                                                                                                                                                                                                                                                                                  int res = 1;
                                                                                                                                                                                                                                                                                  for (int i = 1; i < n; ++i) {
                                                                                                                                                                                                                                                                                      for (int j = 0; j < i; ++j) {
                                                                                                                                                                                                                                                                                          if (nums[j] < nums[i]) {
                                                                                                                                                                                                                                                                                              dp[i] = Math.max(dp[i], dp[j] + 1);
                                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      res = Math.max(res, dp[i]);
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  return res;
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                          • 1
                                                                                                                                                                                                                                                                          • 2
                                                                                                                                                                                                                                                                          • 3
                                                                                                                                                                                                                                                                          • 4
                                                                                                                                                                                                                                                                          • 5
                                                                                                                                                                                                                                                                          • 6
                                                                                                                                                                                                                                                                          • 7
                                                                                                                                                                                                                                                                          • 8
                                                                                                                                                                                                                                                                          • 9
                                                                                                                                                                                                                                                                          • 10
                                                                                                                                                                                                                                                                          • 11
                                                                                                                                                                                                                                                                          • 12
                                                                                                                                                                                                                                                                          • 13
                                                                                                                                                                                                                                                                          • 14
                                                                                                                                                                                                                                                                          • 15
                                                                                                                                                                                                                                                                          • 16
                                                                                                                                                                                                                                                                          • 17

                                                                                                                                                                                                                                                                          301. 删除无效的括号

                                                                                                                                                                                                                                                                          题目描述

                                                                                                                                                                                                                                                                          删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

                                                                                                                                                                                                                                                                          说明: 输入可能包含了除 ( 和 ) 以外的字符。

                                                                                                                                                                                                                                                                          示例 1:

                                                                                                                                                                                                                                                                          输入: "()())()"
                                                                                                                                                                                                                                                                          输出: ["()()()", "(())()"]
                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                                                                          示例 2:

                                                                                                                                                                                                                                                                          输入: "(a)())()"
                                                                                                                                                                                                                                                                          输出: ["(a)()()", "(a())()"]
                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                                                                          示例 3:

                                                                                                                                                                                                                                                                          输入: ")("
                                                                                                                                                                                                                                                                          输出: [""]

                                                                                                                                                                                                                                                                          解法

                                                                                                                                                                                                                                                                          Java

                                                                                                                                                                                                                                                                          class Solution {
                                                                                                                                                                                                                                                                              public List<String> removeInvalidParentheses(String s) {
                                                                                                                                                                                                                                                                                  // 最终结果去重
                                                                                                                                                                                                                                                                                  HashSet<String> set = new HashSet<>();
                                                                                                                                                                                                                                                                                  // 先遍历一遍,比对,找出需要删除的"("和")"的个数
                                                                                                                                                                                                                                                                                  // 当前处理字符的位置
                                                                                                                                                                                                                                                                                  int index = 0;
                                                                                                                                                                                                                                                                                  // 需要删除"("的个数
                                                                                                                                                                                                                                                                                  int leftToDelete = 0;
                                                                                                                                                                                                                                                                                  // 需要删除")"的个数
                                                                                                                                                                                                                                                                                  int rightToDelete = 0;
                                                                                                                                                                                                                                                                                  // 剩余几个"("没有匹配到")"
                                                                                                                                                                                                                                                                                  int leftCount = 0;
                                                                                                                                                                                                                                                                                  char[] chars = s.toCharArray();
                                                                                                                                                                                                                                                                                  for (char c : chars) {
                                                                                                                                                                                                                                                                                      switch (c) {
                                                                                                                                                                                                                                                                                          case '(':
                                                                                                                                                                                                                                                                                              leftToDelete++;
                                                                                                                                                                                                                                                                                              break;
                                                                                                                                                                                                                                                                                          case ')':
                                                                                                                                                                                                                                                                                              if (leftToDelete > 0) {
                                                                                                                                                                                                                                                                                                  // 抵消
                                                                                                                                                                                                                                                                                                  leftToDelete--;
                                                                                                                                                                                                                                                                                              } else {
                                                                                                                                                                                                                                                                                                  rightToDelete++;
                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                              break;
                                                                                                                                                                                                                                                                                          default:
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  dfs(s, index, leftCount, leftToDelete, rightToDelete, set, new StringBuilder());
                                                                                                                                                                                                                                                                                  ArrayList<String> list = new ArrayList<>();
                                                                                                                                                                                                                                                                                  list.addAll(set);
                                                                                                                                                                                                                                                                                  return list;
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                              private void dfs(String s, int index, int leftCount, int leftToDelete, int rightToDelete, HashSet<String> set, StringBuilder sb) {
                                                                                                                                                                                                                                                                                  if (index == s.length()) {
                                                                                                                                                                                                                                                                                      if (leftToDelete == 0 && rightToDelete == 0 && leftCount == 0) {
                                                                                                                                                                                                                                                                                          set.add(sb.toString());
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      return;
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  char c = s.charAt(index);
                                                                                                                                                                                                                                                                                  if (c == '(') {
                                                                                                                                                                                                                                                                                      // 如果是'(',那么要么删除,要么保留.
                                                                                                                                                                                                                                                                                      // 如果删除
                                                                                                                                                                                                                                                                                      if (leftToDelete > 0) {
                                                                                                                                                                                                                                                                                          StringBuilder tmp = new StringBuilder(sb);
                                                                                                                                                                                                                                                                                          dfs(s, index + 1, leftCount, leftToDelete - 1, rightToDelete, set, tmp);
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      // 不删,或者没有可以删除的
                                                                                                                                                                                                                                                                                      StringBuilder tmp = new StringBuilder(sb);
                                                                                                                                                                                                                                                                                      tmp.append(c);
                                                                                                                                                                                                                                                                                      dfs(s, index + 1, leftCount + 1, leftToDelete, rightToDelete, set, tmp);
                                                                                                                                                                                                                                                                                  } else if (c == ')') {
                                                                                                                                                                                                                                                                                      // 删除
                                                                                                                                                                                                                                                                                      if (rightToDelete > 0) {
                                                                                                                                                                                                                                                                                          StringBuilder tmp = new StringBuilder(sb);
                                                                                                                                                                                                                                                                                          dfs(s, index + 1, leftCount, leftToDelete, rightToDelete - 1, set, tmp);
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      // 在前面有'('的时候保留.
                                                                                                                                                                                                                                                                                      if (leftCount > 0) {
                                                                                                                                                                                                                                                                                          StringBuilder tmp = new StringBuilder(sb);
                                                                                                                                                                                                                                                                                          tmp.append(c);
                                                                                                                                                                                                                                                                                          dfs(s, index + 1, leftCount - 1, leftToDelete, rightToDelete, set, tmp);
                                                                                                                                                                                                                                                                                      } else {
                                                                                                                                                                                                                                                                                          // ")"这个没有"("和他对应,结束
                                                                                                                                                                                                                                                                                          return;
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                  } else {
                                                                                                                                                                                                                                                                                      // 其他字符
                                                                                                                                                                                                                                                                                      StringBuilder tmp = new StringBuilder(sb);
                                                                                                                                                                                                                                                                                      tmp.append(c);
                                                                                                                                                                                                                                                                                      dfs(s, index + 1, leftCount, leftToDelete, rightToDelete, set, tmp);
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                          • 1
                                                                                                                                                                                                                                                                          • 2
                                                                                                                                                                                                                                                                          • 3
                                                                                                                                                                                                                                                                          • 4
                                                                                                                                                                                                                                                                          • 5
                                                                                                                                                                                                                                                                          • 6
                                                                                                                                                                                                                                                                          • 7
                                                                                                                                                                                                                                                                          • 8
                                                                                                                                                                                                                                                                          • 9
                                                                                                                                                                                                                                                                          • 10
                                                                                                                                                                                                                                                                          • 11
                                                                                                                                                                                                                                                                          • 12
                                                                                                                                                                                                                                                                          • 13
                                                                                                                                                                                                                                                                          • 14
                                                                                                                                                                                                                                                                          • 15
                                                                                                                                                                                                                                                                          • 16
                                                                                                                                                                                                                                                                          • 17
                                                                                                                                                                                                                                                                          • 18
                                                                                                                                                                                                                                                                          • 19
                                                                                                                                                                                                                                                                          • 20
                                                                                                                                                                                                                                                                          • 21
                                                                                                                                                                                                                                                                          • 22
                                                                                                                                                                                                                                                                          • 23
                                                                                                                                                                                                                                                                          • 24
                                                                                                                                                                                                                                                                          • 25
                                                                                                                                                                                                                                                                          • 26
                                                                                                                                                                                                                                                                          • 27
                                                                                                                                                                                                                                                                          • 28
                                                                                                                                                                                                                                                                          • 29
                                                                                                                                                                                                                                                                          • 30
                                                                                                                                                                                                                                                                          • 31
                                                                                                                                                                                                                                                                          • 32
                                                                                                                                                                                                                                                                          • 33
                                                                                                                                                                                                                                                                          • 34
                                                                                                                                                                                                                                                                          • 35
                                                                                                                                                                                                                                                                          • 36
                                                                                                                                                                                                                                                                          • 37
                                                                                                                                                                                                                                                                          • 38
                                                                                                                                                                                                                                                                          • 39
                                                                                                                                                                                                                                                                          • 40
                                                                                                                                                                                                                                                                          • 41
                                                                                                                                                                                                                                                                          • 42
                                                                                                                                                                                                                                                                          • 43
                                                                                                                                                                                                                                                                          • 44
                                                                                                                                                                                                                                                                          • 45
                                                                                                                                                                                                                                                                          • 46
                                                                                                                                                                                                                                                                          • 47
                                                                                                                                                                                                                                                                          • 48
                                                                                                                                                                                                                                                                          • 49
                                                                                                                                                                                                                                                                          • 50
                                                                                                                                                                                                                                                                          • 51
                                                                                                                                                                                                                                                                          • 52
                                                                                                                                                                                                                                                                          • 53
                                                                                                                                                                                                                                                                          • 54
                                                                                                                                                                                                                                                                          • 55
                                                                                                                                                                                                                                                                          • 56
                                                                                                                                                                                                                                                                          • 57
                                                                                                                                                                                                                                                                          • 58
                                                                                                                                                                                                                                                                          • 59
                                                                                                                                                                                                                                                                          • 60
                                                                                                                                                                                                                                                                          • 61
                                                                                                                                                                                                                                                                          • 62
                                                                                                                                                                                                                                                                          • 63
                                                                                                                                                                                                                                                                          • 64
                                                                                                                                                                                                                                                                          • 65
                                                                                                                                                                                                                                                                          • 66
                                                                                                                                                                                                                                                                          • 67
                                                                                                                                                                                                                                                                          • 68
                                                                                                                                                                                                                                                                          • 69
                                                                                                                                                                                                                                                                          • 70
                                                                                                                                                                                                                                                                          • 71
                                                                                                                                                                                                                                                                          • 72
                                                                                                                                                                                                                                                                          • 73
                                                                                                                                                                                                                                                                          • 74
                                                                                                                                                                                                                                                                          • 75
                                                                                                                                                                                                                                                                          • 76
                                                                                                                                                                                                                                                                          • 77

                                                                                                                                                                                                                                                                          303. 区域和检索 - 数组不可变

                                                                                                                                                                                                                                                                          题目描述

                                                                                                                                                                                                                                                                          给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。

                                                                                                                                                                                                                                                                          示例:

                                                                                                                                                                                                                                                                          给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
                                                                                                                                                                                                                                                                          sumRange(0, 2) -> 1
                                                                                                                                                                                                                                                                          sumRange(2, 5) -> -1
                                                                                                                                                                                                                                                                          sumRange(0, 5) -> -3

                                                                                                                                                                                                                                                                          说明:

                                                                                                                                                                                                                                                                          1. 你可以假设数组不可变。
                                                                                                                                                                                                                                                                          2. 会多次调用 sumRange 方法。

                                                                                                                                                                                                                                                                          解法

                                                                                                                                                                                                                                                                          Java

                                                                                                                                                                                                                                                                          class NumArray {
                                                                                                                                                                                                                                                                          	private int[] nums;
                                                                                                                                                                                                                                                                          	private int[] sums;
                                                                                                                                                                                                                                                                          	public NumArray(int[] tmp) {
                                                                                                                                                                                                                                                                          		this.nums = Arrays.copyOf(tmp, tmp.length);
                                                                                                                                                                                                                                                                          		sums = new int[nums.length + 1];
                                                                                                                                                                                                                                                                          		for (int i = 0; i < nums.length; i++) {
                                                                                                                                                                                                                                                                          			sums[i + 1] += nums[i] + sums[i];
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          	}
                                                                                                                                                                                                                                                                          	public int sumRange(int i, int j) {
                                                                                                                                                                                                                                                                          		if (i < 0 || j > nums.length || i > j) {
                                                                                                                                                                                                                                                                          			return 0;
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          		return sums[j + 1] - sums[i];
                                                                                                                                                                                                                                                                          	}
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          /**
                                                                                                                                                                                                                                                                           * Your NumArray object will be instantiated and called as such:
                                                                                                                                                                                                                                                                           * NumArray obj = new NumArray(nums);
                                                                                                                                                                                                                                                                           * int param_1 = obj.sumRange(i,j);
                                                                                                                                                                                                                                                                           */
                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                          • 1
                                                                                                                                                                                                                                                                          • 2
                                                                                                                                                                                                                                                                          • 3
                                                                                                                                                                                                                                                                          • 4
                                                                                                                                                                                                                                                                          • 5
                                                                                                                                                                                                                                                                          • 6
                                                                                                                                                                                                                                                                          • 7
                                                                                                                                                                                                                                                                          • 8
                                                                                                                                                                                                                                                                          • 9
                                                                                                                                                                                                                                                                          • 10
                                                                                                                                                                                                                                                                          • 11
                                                                                                                                                                                                                                                                          • 12
                                                                                                                                                                                                                                                                          • 13
                                                                                                                                                                                                                                                                          • 14
                                                                                                                                                                                                                                                                          • 15
                                                                                                                                                                                                                                                                          • 16
                                                                                                                                                                                                                                                                          • 17
                                                                                                                                                                                                                                                                          • 18
                                                                                                                                                                                                                                                                          • 19
                                                                                                                                                                                                                                                                          • 20
                                                                                                                                                                                                                                                                          • 21
                                                                                                                                                                                                                                                                          • 22

                                                                                                                                                                                                                                                                          304. 二维区域和检索 - 矩阵不可变

                                                                                                                                                                                                                                                                          题目描述

                                                                                                                                                                                                                                                                          给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

                                                                                                                                                                                                                                                                          在这里插入图片描述
                                                                                                                                                                                                                                                                          上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

                                                                                                                                                                                                                                                                          示例:

                                                                                                                                                                                                                                                                          给定 matrix = [
                                                                                                                                                                                                                                                                            [3, 0, 1, 4, 2],
                                                                                                                                                                                                                                                                            [5, 6, 3, 2, 1],
                                                                                                                                                                                                                                                                            [1, 2, 0, 1, 5],
                                                                                                                                                                                                                                                                            [4, 1, 0, 1, 7],
                                                                                                                                                                                                                                                                            [1, 0, 3, 0, 5]
                                                                                                                                                                                                                                                                          ]
                                                                                                                                                                                                                                                                          sumRegion(2, 1, 4, 3) -> 8
                                                                                                                                                                                                                                                                          sumRegion(1, 1, 2, 2) -> 11
                                                                                                                                                                                                                                                                          sumRegion(1, 2, 2, 4) -> 12
                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                                                                          说明:

                                                                                                                                                                                                                                                                          1. 你可以假设矩阵不可变。
                                                                                                                                                                                                                                                                          2. 会多次调用 sumRegion 方法
                                                                                                                                                                                                                                                                          3. 你可以假设 row1 ≤ row2 且 col1 ≤ col2。

                                                                                                                                                                                                                                                                          解法

                                                                                                                                                                                                                                                                          Java

                                                                                                                                                                                                                                                                          public class NumMatrix {
                                                                                                                                                                                                                                                                          	public long[][] sumMatrix;
                                                                                                                                                                                                                                                                          	public NumMatrix(int[][] matrix) {
                                                                                                                                                                                                                                                                          		if (matrix == null || matrix.length == 0) {
                                                                                                                                                                                                                                                                          			return;
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          		sumMatrix = new long[matrix.length + 1][matrix[0].length + 1];
                                                                                                                                                                                                                                                                          		for (int i = 0; i < matrix.length; i++) {
                                                                                                                                                                                                                                                                          			for (int j = 0; j < matrix[0].length; j++) {
                                                                                                                                                                                                                                                                          				sumMatrix[i][j + 1] = sumMatrix[i][j] + matrix[i][j];
                                                                                                                                                                                                                                                                          			}
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          	}
                                                                                                                                                                                                                                                                          	public int sumRegion(int row1, int col1, int row2, int col2) {
                                                                                                                                                                                                                                                                          		if (sumMatrix == null || row1 < 0 || row2 < 0 || col1 < 0
                                                                                                                                                                                                                                                                          				|| col2 < 0 || row1 >= sumMatrix.length - 1
                                                                                                                                                                                                                                                                          				|| row2 >= sumMatrix.length - 1
                                                                                                                                                                                                                                                                          				|| col1 >= sumMatrix[0].length - 1
                                                                                                                                                                                                                                                                          				|| col2 >= sumMatrix[0].length - 1 || row1 > row2
                                                                                                                                                                                                                                                                          				|| col1 > col2) {
                                                                                                                                                                                                                                                                          			return Integer.MIN_VALUE;
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          		long rt = 0;
                                                                                                                                                                                                                                                                          		for (int i = row1; i <= row2; i++) {
                                                                                                                                                                                                                                                                          			rt += sumMatrix[i][col2 + 1] - sumMatrix[i][col1];
                                                                                                                                                                                                                                                                          		}
                                                                                                                                                                                                                                                                          		return (int) rt;
                                                                                                                                                                                                                                                                          	}
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                          // Your NumMatrix object will be instantiated and called as such:
                                                                                                                                                                                                                                                                          // NumMatrix numMatrix = new NumMatrix(matrix);
                                                                                                                                                                                                                                                                          // numMatrix.sumRegion(0, 1, 2, 3);
                                                                                                                                                                                                                                                                          // numMatrix.sumRegion(1, 2, 3, 4);
                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                          • 1
                                                                                                                                                                                                                                                                          • 2
                                                                                                                                                                                                                                                                          • 3
                                                                                                                                                                                                                                                                          • 4
                                                                                                                                                                                                                                                                          • 5
                                                                                                                                                                                                                                                                          • 6
                                                                                                                                                                                                                                                                          • 7
                                                                                                                                                                                                                                                                          • 8
                                                                                                                                                                                                                                                                          • 9
                                                                                                                                                                                                                                                                          • 10
                                                                                                                                                                                                                                                                          • 11
                                                                                                                                                                                                                                                                          • 12
                                                                                                                                                                                                                                                                          • 13
                                                                                                                                                                                                                                                                          • 14
                                                                                                                                                                                                                                                                          • 15
                                                                                                                                                                                                                                                                          • 16
                                                                                                                                                                                                                                                                          • 17
                                                                                                                                                                                                                                                                          • 18
                                                                                                                                                                                                                                                                          • 19
                                                                                                                                                                                                                                                                          • 20
                                                                                                                                                                                                                                                                          • 21
                                                                                                                                                                                                                                                                          • 22
                                                                                                                                                                                                                                                                          • 23
                                                                                                                                                                                                                                                                          • 24
                                                                                                                                                                                                                                                                          • 25
                                                                                                                                                                                                                                                                          • 26
                                                                                                                                                                                                                                                                          • 27
                                                                                                                                                                                                                                                                          • 28
                                                                                                                                                                                                                                                                          • 29
                                                                                                                                                                                                                                                                          • 30
                                                                                                                                                                                                                                                                          • 31
                                                                                                                                                                                                                                                                          • 32
                                                                                                                                                                                                                                                                          • 33

                                                                                                                                                                                                                                                                          306. 累加数

                                                                                                                                                                                                                                                                          题目描述

                                                                                                                                                                                                                                                                          累加数是一个字符串,组成它的数字可以形成累加序列。

                                                                                                                                                                                                                                                                          一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

                                                                                                                                                                                                                                                                          给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。

                                                                                                                                                                                                                                                                          说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

                                                                                                                                                                                                                                                                          示例 1:

                                                                                                                                                                                                                                                                          输入: "112358"
                                                                                                                                                                                                                                                                          输出: true 
                                                                                                                                                                                                                                                                          解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                                                                              示例 2:

                                                                                                                                                                                                                                                                              输入: "199100199"
                                                                                                                                                                                                                                                                              输出: true 
                                                                                                                                                                                                                                                                              解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

                                                                                                                                                                                                                                                                                  进阶:
                                                                                                                                                                                                                                                                                  你如何处理一个溢出的过大的整数输入?

                                                                                                                                                                                                                                                                                  解法

                                                                                                                                                                                                                                                                                  Java

                                                                                                                                                                                                                                                                                  public class Solution {
                                                                                                                                                                                                                                                                                  	public boolean isAdditiveNumber(String num) {
                                                                                                                                                                                                                                                                                  		int n = num.length();
                                                                                                                                                                                                                                                                                  		for (int i = 1; i <= n / 2; i++) {
                                                                                                                                                                                                                                                                                  			for (int j = 1; Math.max(j, i) <= n - i - j; j++) {
                                                                                                                                                                                                                                                                                  				if (isValid(i, j, num)) {
                                                                                                                                                                                                                                                                                  					return true;
                                                                                                                                                                                                                                                                                  				}
                                                                                                                                                                                                                                                                                  			}
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		return false;
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	private boolean isValid(int i, int j, String num) {
                                                                                                                                                                                                                                                                                  		if (num.charAt(0) == '0' && i > 1) {
                                                                                                                                                                                                                                                                                  			return false;
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		if (num.charAt(i) == '0' && j > 1) {
                                                                                                                                                                                                                                                                                  			return false;
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		String sum;
                                                                                                                                                                                                                                                                                  		Long x1 = Long.parseLong(num.substring(0, i));
                                                                                                                                                                                                                                                                                  		Long x2 = Long.parseLong(num.substring(i, i + j));
                                                                                                                                                                                                                                                                                  		for (int start = i + j; start < num.length(); start += sum.length()) {
                                                                                                                                                                                                                                                                                  			x2 = x1 + x2;
                                                                                                                                                                                                                                                                                  			x1 = x2 - x1;
                                                                                                                                                                                                                                                                                  			sum = x2.toString();
                                                                                                                                                                                                                                                                                  			if (!num.startsWith(sum, start)) {
                                                                                                                                                                                                                                                                                  				return false;
                                                                                                                                                                                                                                                                                  			}
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		return true;
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                  • 1
                                                                                                                                                                                                                                                                                  • 2
                                                                                                                                                                                                                                                                                  • 3
                                                                                                                                                                                                                                                                                  • 4
                                                                                                                                                                                                                                                                                  • 5
                                                                                                                                                                                                                                                                                  • 6
                                                                                                                                                                                                                                                                                  • 7
                                                                                                                                                                                                                                                                                  • 8
                                                                                                                                                                                                                                                                                  • 9
                                                                                                                                                                                                                                                                                  • 10
                                                                                                                                                                                                                                                                                  • 11
                                                                                                                                                                                                                                                                                  • 12
                                                                                                                                                                                                                                                                                  • 13
                                                                                                                                                                                                                                                                                  • 14
                                                                                                                                                                                                                                                                                  • 15
                                                                                                                                                                                                                                                                                  • 16
                                                                                                                                                                                                                                                                                  • 17
                                                                                                                                                                                                                                                                                  • 18
                                                                                                                                                                                                                                                                                  • 19
                                                                                                                                                                                                                                                                                  • 20
                                                                                                                                                                                                                                                                                  • 21
                                                                                                                                                                                                                                                                                  • 22
                                                                                                                                                                                                                                                                                  • 23
                                                                                                                                                                                                                                                                                  • 24
                                                                                                                                                                                                                                                                                  • 25
                                                                                                                                                                                                                                                                                  • 26
                                                                                                                                                                                                                                                                                  • 27
                                                                                                                                                                                                                                                                                  • 28
                                                                                                                                                                                                                                                                                  • 29
                                                                                                                                                                                                                                                                                  • 30
                                                                                                                                                                                                                                                                                  • 31
                                                                                                                                                                                                                                                                                  • 32
                                                                                                                                                                                                                                                                                  • 33

                                                                                                                                                                                                                                                                                  307. 区域和检索 - 数组可修改

                                                                                                                                                                                                                                                                                  题目描述

                                                                                                                                                                                                                                                                                  给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。

                                                                                                                                                                                                                                                                                  update(i, val) 函数可以通过将下标为 的数值更新为 val,从而对数列进行修改。

                                                                                                                                                                                                                                                                                  示例:

                                                                                                                                                                                                                                                                                  Given nums = [1, 3, 5]
                                                                                                                                                                                                                                                                                  sumRange(0, 2) -> 9
                                                                                                                                                                                                                                                                                  update(1, 2)
                                                                                                                                                                                                                                                                                  sumRange(0, 2) -> 8
                                                                                                                                                                                                                                                                                  

                                                                                                                                                                                                                                                                                  说明:

                                                                                                                                                                                                                                                                                  1. 数组仅可以在 update 函数下进行修改。
                                                                                                                                                                                                                                                                                  2. 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。

                                                                                                                                                                                                                                                                                  解法

                                                                                                                                                                                                                                                                                  Java

                                                                                                                                                                                                                                                                                  public class NumArray {	int[] array, helper;
                                                                                                                                                                                                                                                                                  	public NumArray(int[] nums) {
                                                                                                                                                                                                                                                                                  		array = new int[nums.length];
                                                                                                                                                                                                                                                                                  		helper = new int[nums.length + 1];
                                                                                                                                                                                                                                                                                  		for (int i = 0; i < nums.length; i++) {
                                                                                                                                                                                                                                                                                  			array[i] = nums[i];
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		for (int i = 0; i < nums.length; i++) {
                                                                                                                                                                                                                                                                                  			add(i + 1, nums[i]);
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	private void add(int pos, int value) {
                                                                                                                                                                                                                                                                                  		while (pos < helper.length) {
                                                                                                                                                                                                                                                                                  			helper[pos] += value;
                                                                                                                                                                                                                                                                                  			pos += lowBit(pos);
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	private int lowBit(int pos) {
                                                                                                                                                                                                                                                                                  		return pos & (-pos);
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	private int sum(int pos) {
                                                                                                                                                                                                                                                                                  		int rt = 0;
                                                                                                                                                                                                                                                                                  		while (pos > 0) {
                                                                                                                                                                                                                                                                                  			rt += helper[pos];
                                                                                                                                                                                                                                                                                  			pos -= lowBit(pos);
                                                                                                                                                                                                                                                                                  		}
                                                                                                                                                                                                                                                                                  		return rt;
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	void update(int i, int val) {
                                                                                                                                                                                                                                                                                  		int delta = val - array[i];
                                                                                                                                                                                                                                                                                  		array[i] = val;
                                                                                                                                                                                                                                                                                  		add(i + 1, delta);
                                                                                                                                                                                                                                                                                  	}
                                                                                                                                                                                                                                                                                  	public int sumRange(int i, int j) {
                                                                                                                                                                                                                                                                                  		return sum(j + 1) - sum(i);
                                                                                                                                                                                                                                                                                  	}}
                                                                                                                                                                                                                                                                                  // Your NumArray object will be instantiated and called as such:
                                                                                                                                                                                                                                                                                  // NumArray numArray = new NumArray(nums);
                                                                                                                                                                                                                                                                                  // numArray.sumRange(0, 1);
                                                                                                                                                                                                                                                                                  // numArray.update(1, 10);
                                                                                                                                                                                                                                                                                  // numArray.sumRange(1, 2);
                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                  • 1
                                                                                                                                                                                                                                                                                  • 2
                                                                                                                                                                                                                                                                                  • 3
                                                                                                                                                                                                                                                                                  • 4
                                                                                                                                                                                                                                                                                  • 5
                                                                                                                                                                                                                                                                                  • 6
                                                                                                                                                                                                                                                                                  • 7
                                                                                                                                                                                                                                                                                  • 8
                                                                                                                                                                                                                                                                                  • 9
                                                                                                                                                                                                                                                                                  • 10
                                                                                                                                                                                                                                                                                  • 11
                                                                                                                                                                                                                                                                                  • 12
                                                                                                                                                                                                                                                                                  • 13
                                                                                                                                                                                                                                                                                  • 14
                                                                                                                                                                                                                                                                                  • 15
                                                                                                                                                                                                                                                                                  • 16
                                                                                                                                                                                                                                                                                  • 17
                                                                                                                                                                                                                                                                                  • 18
                                                                                                                                                                                                                                                                                  • 19
                                                                                                                                                                                                                                                                                  • 20
                                                                                                                                                                                                                                                                                  • 21
                                                                                                                                                                                                                                                                                  • 22
                                                                                                                                                                                                                                                                                  • 23
                                                                                                                                                                                                                                                                                  • 24
                                                                                                                                                                                                                                                                                  • 25
                                                                                                                                                                                                                                                                                  • 26
                                                                                                                                                                                                                                                                                  • 27
                                                                                                                                                                                                                                                                                  • 28
                                                                                                                                                                                                                                                                                  • 29
                                                                                                                                                                                                                                                                                  • 30
                                                                                                                                                                                                                                                                                  • 31
                                                                                                                                                                                                                                                                                  • 32
                                                                                                                                                                                                                                                                                  • 33
                                                                                                                                                                                                                                                                                  • 34
                                                                                                                                                                                                                                                                                  • 35
                                                                                                                                                                                                                                                                                  • 36
                                                                                                                                                                                                                                                                                  • 37
                                                                                                                                                                                                                                                                                  • 38
                                                                                                                                                                                                                                                                                  • 39
                                                                                                                                                                                                                                                                                  • 40
                                                                                                                                                                                                                                                                                  • 41

                                                                                                                                                                                                                                                                                  309. 最佳买卖股票时机含冷冻期

                                                                                                                                                                                                                                                                                  题目描述

                                                                                                                                                                                                                                                                                  给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

                                                                                                                                                                                                                                                                                  设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

                                                                                                                                                                                                                                                                                  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
                                                                                                                                                                                                                                                                                  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

                                                                                                                                                                                                                                                                                  示例:

                                                                                                                                                                                                                                                                                  输入: [1,2,3,0,2]
                                                                                                                                                                                                                                                                                  输出: 3 
                                                                                                                                                                                                                                                                                  解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

                                                                                                                                                                                                                                                                                  解法

                                                                                                                                                                                                                                                                                  Java

                                                                                                                                                                                                                                                                                  class Solution {
                                                                                                                                                                                                                                                                                      public int maxProfit(int[] prices) {
                                                                                                                                                                                                                                                                                          if(prices == null || prices.length == 0) return 0;
                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                          int n = prices.length;
                                                                                                                                                                                                                                                                                          // buy[i] 表示第i天持有股票,最大利润
                                                                                                                                                                                                                                                                                          int[] buy = new int[n];
                                                                                                                                                                                                                                                                                          // sell[i] 表示第i天为持股,最大利润
                                                                                                                                                                                                                                                                                          int[] sell = new int[n];
                                                                                                                                                                                                                                                                                          buy[0] = -prices[0];
                                                                                                                                                                                                                                                                                          sell[0] = 0;
                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                          for(int i = 1; i < n; i++) {
                                                                                                                                                                                                                                                                                              buy[i] = Math.max(buy[i - 1], (i > 1 ? sell[i - 2] : 0) - prices[i]);
                                                                                                                                                                                                                                                                                              sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);
                                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                          return sell[n - 1];
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                  • 1
                                                                                                                                                                                                                                                                                  • 2
                                                                                                                                                                                                                                                                                  • 3
                                                                                                                                                                                                                                                                                  • 4
                                                                                                                                                                                                                                                                                  • 5
                                                                                                                                                                                                                                                                                  • 6
                                                                                                                                                                                                                                                                                  • 7
                                                                                                                                                                                                                                                                                  • 8
                                                                                                                                                                                                                                                                                  • 9
                                                                                                                                                                                                                                                                                  • 10
                                                                                                                                                                                                                                                                                  • 11
                                                                                                                                                                                                                                                                                  • 12
                                                                                                                                                                                                                                                                                  • 13
                                                                                                                                                                                                                                                                                  • 14
                                                                                                                                                                                                                                                                                  • 15
                                                                                                                                                                                                                                                                                  • 16
                                                                                                                                                                                                                                                                                  • 17
                                                                                                                                                                                                                                                                                  • 18
                                                                                                                                                                                                                                                                                  • 19
                                                                                                                                                                                                                                                                                  • 20

                                                                                                                                                                                                                                                                                  312. 戳气球

                                                                                                                                                                                                                                                                                  题目描述

                                                                                                                                                                                                                                                                                  n 个气球,编号为0n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

                                                                                                                                                                                                                                                                                  现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。

                                                                                                                                                                                                                                                                                  求所能获得硬币的最大数量。

                                                                                                                                                                                                                                                                                  说明:

                                                                                                                                                                                                                                                                                  • 你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
                                                                                                                                                                                                                                                                                  • 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

                                                                                                                                                                                                                                                                                  示例:

                                                                                                                                                                                                                                                                                  输入: [3,1,5,8]
                                                                                                                                                                                                                                                                                  输出: 167 
                                                                                                                                                                                                                                                                                  解释: nums = [3,1,5,8] --> [3,5,8] -->   [3,8]   -->  [8]  --> []
                                                                                                                                                                                                                                                                                       coins =  3*1*5      +  3*5*8    +  1*3*8      + 1*8*1   = 167
                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                    • 1

                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                        public int maxCoins(int[] nums) {
                                                                                                                                                                                                                                                                                            if (nums == null || nums.length == 0) {
                                                                                                                                                                                                                                                                                                return 0;
                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                            int[][] f = new int[n + 2][n + 2];
                                                                                                                                                                                                                                                                                            for (int i= 0; i < n + 2; ++i) {
                                                                                                                                                                                                                                                                                                for (int j = 0; j < n + 2; ++j) {
                                                                                                                                                                                                                                                                                                    f[i][j] = -1;
                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                            int[] bak = new int[n + 2];
                                                                                                                                                                                                                                                                                            bak[0] = bak[n + 1] = 1;
                                                                                                                                                                                                                                                                                            for (int i = 1; i < n + 1; ++i) {
                                                                                                                                                                                                                                                                                                bak[i] = nums[i - 1];
                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                            return dp(bak, f, 0, n + 1);
                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                        private int dp(int[] nums, int[][] f, int x, int y) {
                                                                                                                                                                                                                                                                                            if (f[x][y] != -1) {
                                                                                                                                                                                                                                                                                                return f[x][y];
                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                            f[x][y] = 0;
                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                            //枚举最后一个戳破的气球的位置
                                                                                                                                                                                                                                                                                            for (int i = x + 1; i < y; ++i) {
                                                                                                                                                                                                                                                                                                f[x][y] = Math.max(f[x][y], nums[i] * nums[x] * nums[y] + dp(nums,f,  x, i) + dp(nums, f, i, y));
                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                            return f[x][y];
                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                    • 38

                                                                                                                                                                                                                                                                                    319. 灯泡开关

                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                    初始时有 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 个灯泡切换一次开关。 对于第 轮,你只切换最后一个灯泡的开关。 找出 轮后有多少个亮着的灯泡。

                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                    输入: 3
                                                                                                                                                                                                                                                                                    输出: 1 
                                                                                                                                                                                                                                                                                    解释: 
                                                                                                                                                                                                                                                                                    初始时, 灯泡状态 [关闭, 关闭, 关闭].
                                                                                                                                                                                                                                                                                    第一轮后, 灯泡状态 [开启, 开启, 开启].
                                                                                                                                                                                                                                                                                    第二轮后, 灯泡状态 [开启, 关闭, 开启].
                                                                                                                                                                                                                                                                                    第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 
                                                                                                                                                                                                                                                                                    你应该返回 1,因为只有一个灯泡还亮着。
                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                        public int bulbSwitch(int n) {
                                                                                                                                                                                                                                                                                            return (int) Math.sqrt(n);
                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                    • 5

                                                                                                                                                                                                                                                                                    322. 零钱兑换

                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                    输入: coins = [1, 2, 5], amount = 11
                                                                                                                                                                                                                                                                                    输出: 3 
                                                                                                                                                                                                                                                                                    解释: 11 = 5 + 5 + 1

                                                                                                                                                                                                                                                                                          示例 2:

                                                                                                                                                                                                                                                                                          输入: coins = [2], amount = 3
                                                                                                                                                                                                                                                                                          输出: -1

                                                                                                                                                                                                                                                                                              说明:
                                                                                                                                                                                                                                                                                              你可以认为每种硬币的数量是无限的。

                                                                                                                                                                                                                                                                                              解法

                                                                                                                                                                                                                                                                                              Java

                                                                                                                                                                                                                                                                                                328. 奇偶链表

                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

                                                                                                                                                                                                                                                                                                请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                输入: 1->2->3->4->5->NULL
                                                                                                                                                                                                                                                                                                输出: 1->3->5->2->4->NULL
                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                输入: 2->1->3->5->6->4->7->NULL 
                                                                                                                                                                                                                                                                                                输出: 2->3->6->7->1->5->4->NULL

                                                                                                                                                                                                                                                                                                说明:

                                                                                                                                                                                                                                                                                                • 应当保持奇数节点和偶数节点的相对顺序。
                                                                                                                                                                                                                                                                                                • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                /**
                                                                                                                                                                                                                                                                                                 * Definition for singly-linked list.
                                                                                                                                                                                                                                                                                                 * public class ListNode {
                                                                                                                                                                                                                                                                                                 *     int val;
                                                                                                                                                                                                                                                                                                 *     ListNode next;
                                                                                                                                                                                                                                                                                                 *     ListNode() {}
                                                                                                                                                                                                                                                                                                 *     ListNode(int val) { this.val = val; }
                                                                                                                                                                                                                                                                                                 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
                                                                                                                                                                                                                                                                                                 * }
                                                                                                                                                                                                                                                                                                 */
                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                    public ListNode oddEvenList(ListNode head) {
                                                                                                                                                                                                                                                                                                        if (head == null) {
                                                                                                                                                                                                                                                                                                            return head;
                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                        ListNode evenHead = head.next;
                                                                                                                                                                                                                                                                                                        ListNode odd = head, even = evenHead;
                                                                                                                                                                                                                                                                                                        while (even != null && even.next != null) {
                                                                                                                                                                                                                                                                                                            odd.next = even.next;
                                                                                                                                                                                                                                                                                                            odd = odd.next;
                                                                                                                                                                                                                                                                                                            even.next = odd.next;
                                                                                                                                                                                                                                                                                                            even = even.next;
                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                        odd.next = evenHead;
                                                                                                                                                                                                                                                                                                        return head;
                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                • 20
                                                                                                                                                                                                                                                                                                • 21
                                                                                                                                                                                                                                                                                                • 22
                                                                                                                                                                                                                                                                                                • 23
                                                                                                                                                                                                                                                                                                • 24
                                                                                                                                                                                                                                                                                                • 25
                                                                                                                                                                                                                                                                                                • 26
                                                                                                                                                                                                                                                                                                • 27

                                                                                                                                                                                                                                                                                                329. 矩阵中的最长递增路径

                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                给定一个整数矩阵,找出最长递增路径的长度。

                                                                                                                                                                                                                                                                                                对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                输入: nums = 
                                                                                                                                                                                                                                                                                                [
                                                                                                                                                                                                                                                                                                  [9,9,4],
                                                                                                                                                                                                                                                                                                  [6,6,8],
                                                                                                                                                                                                                                                                                                  [2,1,1]
                                                                                                                                                                                                                                                                                                ] 
                                                                                                                                                                                                                                                                                                输出: 4 
                                                                                                                                                                                                                                                                                                解释: 最长递增路径为 [1, 2, 6, 9]

                                                                                                                                                                                                                                                                                                  示例 2:

                                                                                                                                                                                                                                                                                                  输入: nums = 
                                                                                                                                                                                                                                                                                                  [
                                                                                                                                                                                                                                                                                                    [3,4,5],
                                                                                                                                                                                                                                                                                                    [3,2,6],
                                                                                                                                                                                                                                                                                                    [2,2,1]
                                                                                                                                                                                                                                                                                                  ] 
                                                                                                                                                                                                                                                                                                  输出: 4 
                                                                                                                                                                                                                                                                                                  解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
                                                                                                                                                                                                                                                                                                  

                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                    public class Solution {
                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                        public static final int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                        public int robot(int x, int y, int[][] m, int[][] cache) {
                                                                                                                                                                                                                                                                                                            if(cache[x][y] != 0) return cache[x][y];
                                                                                                                                                                                                                                                                                                            int max = 1;
                                                                                                                                                                                                                                                                                                            for(int[] dir : dirs) {
                                                                                                                                                                                                                                                                                                                int dx = dir[0], dy = dir[1];
                                                                                                                                                                                                                                                                                                                if(x + dx < 0 || x + dx >= m.length || y + dy < 0 || y + dy >= m[0].length || m[x][y] <= m[x + dx][y + dy]) {
                                                                                                                                                                                                                                                                                                                    continue;
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                max = Math.max(max, robot(x + dx, y + dy, m, cache) + 1);
                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                            cache[x][y] = max;
                                                                                                                                                                                                                                                                                                            return max;
                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                        public int longestIncreasingPath(int[][] matrix) {
                                                                                                                                                                                                                                                                                                            if(matrix.length == 0) return 0;
                                                                                                                                                                                                                                                                                                            int m = matrix.length, n = matrix[0].length;
                                                                                                                                                                                                                                                                                                            int[][] cache = new int[m][n];
                                                                                                                                                                                                                                                                                                            int ans = 1;
                                                                                                                                                                                                                                                                                                            // 枚举每一个点,计算每个点的最大升序
                                                                                                                                                                                                                                                                                                            for(int i = 0; i < m; i++) {
                                                                                                                                                                                                                                                                                                                for(int j = 0; j < n; j++) {
                                                                                                                                                                                                                                                                                                                    ans = Math.max(ans, robot(i, j, matrix, cache));
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                            return ans;
                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                    • 32

                                                                                                                                                                                                                                                                                                    331. 验证二叉树的前序序列化

                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                    序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

                                                                                                                                                                                                                                                                                                         _9_
                                                                                                                                                                                                                                                                                                        /   \
                                                                                                                                                                                                                                                                                                       3     2
                                                                                                                                                                                                                                                                                                      / \   / \
                                                                                                                                                                                                                                                                                                     4   1  #  6
                                                                                                                                                                                                                                                                                                    / \ / \   / \
                                                                                                                                                                                                                                                                                                    # # # #   # #
                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                    例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

                                                                                                                                                                                                                                                                                                    给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

                                                                                                                                                                                                                                                                                                    每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#'

                                                                                                                                                                                                                                                                                                    你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3"

                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                    输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
                                                                                                                                                                                                                                                                                                    输出: true

                                                                                                                                                                                                                                                                                                        示例 2:

                                                                                                                                                                                                                                                                                                        输入: "1,#"
                                                                                                                                                                                                                                                                                                        输出: false
                                                                                                                                                                                                                                                                                                        

                                                                                                                                                                                                                                                                                                            示例 3:

                                                                                                                                                                                                                                                                                                            输入: "9,#,#,1"
                                                                                                                                                                                                                                                                                                            输出: false

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public boolean isValidSerialization(String preorder) {
                                                                                                                                                                                                                                                                                                                        String[] strs = preorder.split(",");
                                                                                                                                                                                                                                                                                                                        int diff = 1;
                                                                                                                                                                                                                                                                                                                        for (String s : strs) {
                                                                                                                                                                                                                                                                                                                            if (--diff < 0) {
                                                                                                                                                                                                                                                                                                                                return false;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (!s.equals("#")) {
                                                                                                                                                                                                                                                                                                                                diff += 2;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return diff == 0;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15

                                                                                                                                                                                                                                                                                                                337. 打家劫舍 III

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

                                                                                                                                                                                                                                                                                                                计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: [3,2,3,null,3,null,1]
                                                                                                                                                                                                                                                                                                                     3
                                                                                                                                                                                                                                                                                                                    / \
                                                                                                                                                                                                                                                                                                                   2   3
                                                                                                                                                                                                                                                                                                                    \   \ 
                                                                                                                                                                                                                                                                                                                     3   1
                                                                                                                                                                                                                                                                                                                输出: 7 
                                                                                                                                                                                                                                                                                                                解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: [3,4,5,1,3,null,1]
                                                                                                                                                                                                                                                                                                                     3
                                                                                                                                                                                                                                                                                                                    / \
                                                                                                                                                                                                                                                                                                                   4   5
                                                                                                                                                                                                                                                                                                                  / \   \ 
                                                                                                                                                                                                                                                                                                                 1   3   1
                                                                                                                                                                                                                                                                                                                输出: 9
                                                                                                                                                                                                                                                                                                                解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                /**
                                                                                                                                                                                                                                                                                                                 * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                 * public class TreeNode {
                                                                                                                                                                                                                                                                                                                 *     int val;
                                                                                                                                                                                                                                                                                                                 *     TreeNode left;
                                                                                                                                                                                                                                                                                                                 *     TreeNode right;
                                                                                                                                                                                                                                                                                                                 *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                 * }
                                                                                                                                                                                                                                                                                                                 */
                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    Map<TreeNode, Integer> memo = new HashMap<>();
                                                                                                                                                                                                                                                                                                                    public int rob(TreeNode root) {
                                                                                                                                                                                                                                                                                                                        if (root == null) return 0;
                                                                                                                                                                                                                                                                                                                        if (memo.containsKey(root))
                                                                                                                                                                                                                                                                                                                            return memo.get(root);
                                                                                                                                                                                                                                                                                                                        int do_it = root.val
                                                                                                                                                                                                                                                                                                                                + (root.left == null ? 0 : rob(root.left.left) + rob(root.left.right))
                                                                                                                                                                                                                                                                                                                                + (root.right == null ? 0 : rob(root.right.left) + rob(root.right.right));
                                                                                                                                                                                                                                                                                                                        int not_do = rob(root.left) + rob(root.right);
                                                                                                                                                                                                                                                                                                                        int res = Math.max(do_it, not_do);
                                                                                                                                                                                                                                                                                                                        memo.put(root, res);
                                                                                                                                                                                                                                                                                                                        return res;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                                • 20
                                                                                                                                                                                                                                                                                                                • 21
                                                                                                                                                                                                                                                                                                                • 22
                                                                                                                                                                                                                                                                                                                • 23
                                                                                                                                                                                                                                                                                                                • 24

                                                                                                                                                                                                                                                                                                                342. 4 的幂

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: 16
                                                                                                                                                                                                                                                                                                                输出: true
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: 5
                                                                                                                                                                                                                                                                                                                输出: false

                                                                                                                                                                                                                                                                                                                进阶:
                                                                                                                                                                                                                                                                                                                你能不使用循环或者递归来完成本题吗?

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                public class Solution {
                                                                                                                                                                                                                                                                                                                    public boolean isPowerOfFour(int n) {
                                                                                                                                                                                                                                                                                                                        if(n <= 0) return false;
                                                                                                                                                                                                                                                                                                                        return ((n & (n - 1)) == 0) && ((n & 0x55555555) != 0);
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6

                                                                                                                                                                                                                                                                                                                343. 整数拆分

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: 2
                                                                                                                                                                                                                                                                                                                输出: 1
                                                                                                                                                                                                                                                                                                                解释: 2 = 1 + 1, 1 × 1 = 1。

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: 10
                                                                                                                                                                                                                                                                                                                输出: 36
                                                                                                                                                                                                                                                                                                                解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

                                                                                                                                                                                                                                                                                                                说明: 你可以假设 不小于 2 且不大于 58。

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public int integerBreak(int n) {
                                                                                                                                                                                                                                                                                                                        if (n < 2) {
                                                                                                                                                                                                                                                                                                                            return 0;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        if (n < 4) {
                                                                                                                                                                                                                                                                                                                            return n - 1;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        int timesOf3 = n / 3;
                                                                                                                                                                                                                                                                                                                        if (n % 3 == 1) {
                                                                                                                                                                                                                                                                                                                            --timesOf3;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        int timesOf2 = (n - timesOf3 * 3) >> 1;
                                                                                                                                                                                                                                                                                                                        return (int) (Math.pow(2, timesOf2) * Math.pow(3, timesOf3));
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16

                                                                                                                                                                                                                                                                                                                344. 反转字符串

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

                                                                                                                                                                                                                                                                                                                不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

                                                                                                                                                                                                                                                                                                                你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

                                                                                                                                                                                                                                                                                                                 

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入:["h","e","l","l","o"]
                                                                                                                                                                                                                                                                                                                输出:["o","l","l","e","h"]
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入:["H","a","n","n","a","h"]
                                                                                                                                                                                                                                                                                                                输出:["h","a","n","n","a","H"]

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public void reverseString(char[] s) {
                                                                                                                                                                                                                                                                                                                        int n;
                                                                                                                                                                                                                                                                                                                        if (s == null || (n = s.length) < 2) return;
                                                                                                                                                                                                                                                                                                                        int i = 0, j = n - 1;
                                                                                                                                                                                                                                                                                                                        while (i < j) {
                                                                                                                                                                                                                                                                                                                            char t = s[i];
                                                                                                                                                                                                                                                                                                                            s[i] = s[j];
                                                                                                                                                                                                                                                                                                                            s[j] = t;
                                                                                                                                                                                                                                                                                                                            ++i;
                                                                                                                                                                                                                                                                                                                            --j;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14

                                                                                                                                                                                                                                                                                                                345. 反转字符串中的元音字母

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: "hello"
                                                                                                                                                                                                                                                                                                                输出: "holle"
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: "leetcode"
                                                                                                                                                                                                                                                                                                                输出: "leotcede"

                                                                                                                                                                                                                                                                                                                说明:
                                                                                                                                                                                                                                                                                                                元音字母不包含字母"y"。

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                将字符串转为字符数组(或列表),定义双指针 p、q,分别指向数组(列表)头部和尾部,当 p、q 指向的字符均为元音字母时,进行交换。
                                                                                                                                                                                                                                                                                                                依次遍历,当 p >= q 时,遍历结束。将字符数组(列表)转为字符串返回即可。

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public String reverseVowels(String s) {
                                                                                                                                                                                                                                                                                                                        if (s == null) {
                                                                                                                                                                                                                                                                                                                            return s;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        char[] chars = s.toCharArray();
                                                                                                                                                                                                                                                                                                                        int p = 0, q = chars.length - 1;
                                                                                                                                                                                                                                                                                                                        while (p < q) {
                                                                                                                                                                                                                                                                                                                            if (!isVowel(chars[p])) {
                                                                                                                                                                                                                                                                                                                                ++p;
                                                                                                                                                                                                                                                                                                                                continue;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (!isVowel(chars[q])) {
                                                                                                                                                                                                                                                                                                                                --q;
                                                                                                                                                                                                                                                                                                                                continue;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            swap(chars, p++, q--);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return String.valueOf(chars);
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    private void swap(char[] chars, int i, int j) {
                                                                                                                                                                                                                                                                                                                        char t = chars[i];
                                                                                                                                                                                                                                                                                                                        chars[i] = chars[j];
                                                                                                                                                                                                                                                                                                                        chars[j] = t;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    private boolean isVowel(char c) {
                                                                                                                                                                                                                                                                                                                        switch(c) {
                                                                                                                                                                                                                                                                                                                        case 'a':
                                                                                                                                                                                                                                                                                                                        case 'e':
                                                                                                                                                                                                                                                                                                                        case 'i':
                                                                                                                                                                                                                                                                                                                        case 'o':
                                                                                                                                                                                                                                                                                                                        case 'u':
                                                                                                                                                                                                                                                                                                                        case 'A':
                                                                                                                                                                                                                                                                                                                        case 'E':
                                                                                                                                                                                                                                                                                                                        case 'I':
                                                                                                                                                                                                                                                                                                                        case 'O':
                                                                                                                                                                                                                                                                                                                        case 'U':
                                                                                                                                                                                                                                                                                                                            return true;
                                                                                                                                                                                                                                                                                                                        default:
                                                                                                                                                                                                                                                                                                                            return false;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                                • 20
                                                                                                                                                                                                                                                                                                                • 21
                                                                                                                                                                                                                                                                                                                • 22
                                                                                                                                                                                                                                                                                                                • 23
                                                                                                                                                                                                                                                                                                                • 24
                                                                                                                                                                                                                                                                                                                • 25
                                                                                                                                                                                                                                                                                                                • 26
                                                                                                                                                                                                                                                                                                                • 27
                                                                                                                                                                                                                                                                                                                • 28
                                                                                                                                                                                                                                                                                                                • 29
                                                                                                                                                                                                                                                                                                                • 30
                                                                                                                                                                                                                                                                                                                • 31
                                                                                                                                                                                                                                                                                                                • 32
                                                                                                                                                                                                                                                                                                                • 33
                                                                                                                                                                                                                                                                                                                • 34
                                                                                                                                                                                                                                                                                                                • 35
                                                                                                                                                                                                                                                                                                                • 36
                                                                                                                                                                                                                                                                                                                • 37
                                                                                                                                                                                                                                                                                                                • 38
                                                                                                                                                                                                                                                                                                                • 39
                                                                                                                                                                                                                                                                                                                • 40
                                                                                                                                                                                                                                                                                                                • 41
                                                                                                                                                                                                                                                                                                                • 42
                                                                                                                                                                                                                                                                                                                • 43

                                                                                                                                                                                                                                                                                                                347. 前 K 个高频元素

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定一个非空的整数数组,返回其中出现频率前 高的元素。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: nums = [1,1,1,2,2,3], k = 2
                                                                                                                                                                                                                                                                                                                输出: [1,2]
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: nums = [1], k = 1
                                                                                                                                                                                                                                                                                                                输出: [1]

                                                                                                                                                                                                                                                                                                                说明:

                                                                                                                                                                                                                                                                                                                • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
                                                                                                                                                                                                                                                                                                                • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public List<Integer> topKFrequent(int[] nums, int k) {
                                                                                                                                                                                                                                                                                                                        Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                        for (int num : nums) {
                                                                                                                                                                                                                                                                                                                            map.put(num, map.getOrDefault(num, 0) + 1);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        List<Integer>[] buckets = new ArrayList[nums.length + 1];
                                                                                                                                                                                                                                                                                                                        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                                                                                                                                                                                                                                                                                                                            int num = entry.getKey();
                                                                                                                                                                                                                                                                                                                            int count = entry.getValue();
                                                                                                                                                                                                                                                                                                                            if (buckets[count] == null) {
                                                                                                                                                                                                                                                                                                                                buckets[count] = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            buckets[count].add(num);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        List<Integer> topK = new ArrayList<>(k);
                                                                                                                                                                                                                                                                                                                        for (int i = buckets.length - 1; i >= 0 && topK.size() < k; --i) {
                                                                                                                                                                                                                                                                                                                            if (buckets[i] != null) {
                                                                                                                                                                                                                                                                                                                                topK.addAll(buckets[i]);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return topK;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                                • 20
                                                                                                                                                                                                                                                                                                                • 21
                                                                                                                                                                                                                                                                                                                • 22
                                                                                                                                                                                                                                                                                                                • 23
                                                                                                                                                                                                                                                                                                                • 24

                                                                                                                                                                                                                                                                                                                349. 两个数组的交集

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定两个数组,编写一个函数来计算它们的交集。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: nums1 = [1,2,2,1], nums2 = [2,2]
                                                                                                                                                                                                                                                                                                                输出: [2]
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
                                                                                                                                                                                                                                                                                                                输出: [9,4]

                                                                                                                                                                                                                                                                                                                说明:

                                                                                                                                                                                                                                                                                                                • 输出结果中的每个元素一定是唯一的。
                                                                                                                                                                                                                                                                                                                • 我们可以不考虑输出结果的顺序。

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public int[] intersection(int[] nums1, int[] nums2) {
                                                                                                                                                                                                                                                                                                                        Set<Integer> s1 = transfer(nums1);
                                                                                                                                                                                                                                                                                                                        Set<Integer> s2 = transfer(nums2);
                                                                                                                                                                                                                                                                                                                        s1.retainAll(s2);
                                                                                                                                                                                                                                                                                                                        int[] output = new int[s1.size()];
                                                                                                                                                                                                                                                                                                                        int i = 0;
                                                                                                                                                                                                                                                                                                                        for (Integer e : s1) {
                                                                                                                                                                                                                                                                                                                            output[i++] = e;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return output;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    private Set<Integer> transfer(int[] nums) {
                                                                                                                                                                                                                                                                                                                        Set<Integer> s = new HashSet<>();
                                                                                                                                                                                                                                                                                                                        for (int e : nums) {
                                                                                                                                                                                                                                                                                                                            s.add(e);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return s;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                                • 20

                                                                                                                                                                                                                                                                                                                350. 两个数组的交集 II

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定两个数组,编写一个函数来计算它们的交集。

                                                                                                                                                                                                                                                                                                                示例 1:

                                                                                                                                                                                                                                                                                                                输入: nums1 = [1,2,2,1], nums2 = [2,2]
                                                                                                                                                                                                                                                                                                                输出: [2,2]
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                示例 2:

                                                                                                                                                                                                                                                                                                                输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
                                                                                                                                                                                                                                                                                                                输出: [4,9]

                                                                                                                                                                                                                                                                                                                说明:

                                                                                                                                                                                                                                                                                                                • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
                                                                                                                                                                                                                                                                                                                • 我们可以不考虑输出结果的顺序。

                                                                                                                                                                                                                                                                                                                进阶:

                                                                                                                                                                                                                                                                                                                • 如果给定的数组已经排好序呢?你将如何优化你的算法?
                                                                                                                                                                                                                                                                                                                • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
                                                                                                                                                                                                                                                                                                                • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

                                                                                                                                                                                                                                                                                                                解法

                                                                                                                                                                                                                                                                                                                Java

                                                                                                                                                                                                                                                                                                                class Solution {
                                                                                                                                                                                                                                                                                                                    public int[] intersect(int[] nums1, int[] nums2) {
                                                                                                                                                                                                                                                                                                                        Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                        for (int num : nums1) {
                                                                                                                                                                                                                                                                                                                            map.put(num, map.getOrDefault(num, 0) + 1);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        List<Integer> list = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                        for (int num : nums2) {
                                                                                                                                                                                                                                                                                                                            int val = map.getOrDefault(num, 0);
                                                                                                                                                                                                                                                                                                                            if (val > 0) {
                                                                                                                                                                                                                                                                                                                                list.add(num);
                                                                                                                                                                                                                                                                                                                                map.put(num, val - 1);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        int i = 0;
                                                                                                                                                                                                                                                                                                                        int[] res = new int[list.size()];
                                                                                                                                                                                                                                                                                                                        for (int num : list) {
                                                                                                                                                                                                                                                                                                                            res[i++] = num;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        return res;
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                • 1
                                                                                                                                                                                                                                                                                                                • 2
                                                                                                                                                                                                                                                                                                                • 3
                                                                                                                                                                                                                                                                                                                • 4
                                                                                                                                                                                                                                                                                                                • 5
                                                                                                                                                                                                                                                                                                                • 6
                                                                                                                                                                                                                                                                                                                • 7
                                                                                                                                                                                                                                                                                                                • 8
                                                                                                                                                                                                                                                                                                                • 9
                                                                                                                                                                                                                                                                                                                • 10
                                                                                                                                                                                                                                                                                                                • 11
                                                                                                                                                                                                                                                                                                                • 12
                                                                                                                                                                                                                                                                                                                • 13
                                                                                                                                                                                                                                                                                                                • 14
                                                                                                                                                                                                                                                                                                                • 15
                                                                                                                                                                                                                                                                                                                • 16
                                                                                                                                                                                                                                                                                                                • 17
                                                                                                                                                                                                                                                                                                                • 18
                                                                                                                                                                                                                                                                                                                • 19
                                                                                                                                                                                                                                                                                                                • 20
                                                                                                                                                                                                                                                                                                                • 21
                                                                                                                                                                                                                                                                                                                • 22

                                                                                                                                                                                                                                                                                                                354. 俄罗斯套娃信封问题

                                                                                                                                                                                                                                                                                                                题目描述

                                                                                                                                                                                                                                                                                                                给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

                                                                                                                                                                                                                                                                                                                请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

                                                                                                                                                                                                                                                                                                                说明:
                                                                                                                                                                                                                                                                                                                不允许旋转信封。

                                                                                                                                                                                                                                                                                                                示例:

                                                                                                                                                                                                                                                                                                                输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
                                                                                                                                                                                                                                                                                                                输出: 3 
                                                                                                                                                                                                                                                                                                                解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    排序 + 最长递增子序列
                                                                                                                                                                                                                                                                                                                    按 w 进行升序排序,若 w 相同则按 h 降序排序。然后问题转换为求 h 数组的最长递增子序列长度。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int maxEnvelopes(int[][] envelopes) {
                                                                                                                                                                                                                                                                                                                            int n;
                                                                                                                                                                                                                                                                                                                            if (envelopes == null || (n = envelopes.length) == 0) return 0;
                                                                                                                                                                                                                                                                                                                            Arrays.sort(envelopes, (a, b) -> {
                                                                                                                                                                                                                                                                                                                                return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
                                                                                                                                                                                                                                                                                                                            });
                                                                                                                                                                                                                                                                                                                            int[] dp = new int[n];
                                                                                                                                                                                                                                                                                                                            Arrays.fill(dp, 1);
                                                                                                                                                                                                                                                                                                                            int res = 1;
                                                                                                                                                                                                                                                                                                                            for (int i = 1; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                for (int j = 0; j < i; ++j) {
                                                                                                                                                                                                                                                                                                                                    if (envelopes[j][1] < envelopes[i][1]) {
                                                                                                                                                                                                                                                                                                                                        dp[i] = Math.max(dp[i], dp[j] + 1);
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                res = Math.max(res, dp[i]);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21

                                                                                                                                                                                                                                                                                                                    355. 设计推特

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:

                                                                                                                                                                                                                                                                                                                    1. postTweet(userId, tweetId): 创建一条新的推文
                                                                                                                                                                                                                                                                                                                    2. getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。
                                                                                                                                                                                                                                                                                                                    3. follow(followerId, followeeId): 关注一个用户
                                                                                                                                                                                                                                                                                                                    4. unfollow(followerId, followeeId): 取消关注一个用户

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    Twitter twitter = new Twitter();
                                                                                                                                                                                                                                                                                                                    // 用户1发送了一条新推文 (用户id = 1, 推文id = 5).
                                                                                                                                                                                                                                                                                                                    twitter.postTweet(1, 5);
                                                                                                                                                                                                                                                                                                                    // 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
                                                                                                                                                                                                                                                                                                                    twitter.getNewsFeed(1);
                                                                                                                                                                                                                                                                                                                    // 用户1关注了用户2.
                                                                                                                                                                                                                                                                                                                    twitter.follow(1, 2);
                                                                                                                                                                                                                                                                                                                    // 用户2发送了一个新推文 (推文id = 6).
                                                                                                                                                                                                                                                                                                                    twitter.postTweet(2, 6);
                                                                                                                                                                                                                                                                                                                    // 用户1的获取推文应当返回一个列表,其中包含两个推文,id分别为 -> [6, 5].
                                                                                                                                                                                                                                                                                                                    // 推文id6应当在推文id5之前,因为它是在5之后发送的.
                                                                                                                                                                                                                                                                                                                    twitter.getNewsFeed(1);
                                                                                                                                                                                                                                                                                                                    // 用户1取消关注了用户2.
                                                                                                                                                                                                                                                                                                                    twitter.unfollow(1, 2);
                                                                                                                                                                                                                                                                                                                    // 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
                                                                                                                                                                                                                                                                                                                    // 因为用户1已经不再关注用户2.
                                                                                                                                                                                                                                                                                                                    twitter.getNewsFeed(1);
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Twitter {
                                                                                                                                                                                                                                                                                                                        class Data {
                                                                                                                                                                                                                                                                                                                            int id, tweetId;
                                                                                                                                                                                                                                                                                                                            public Data(int id, int tweetId) {
                                                                                                                                                                                                                                                                                                                                this.id = id;
                                                                                                                                                                                                                                                                                                                                this.tweetId = tweetId;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private Map<Integer, List<Data>> posts;
                                                                                                                                                                                                                                                                                                                        private Map<Integer, Set<Integer>> follows;
                                                                                                                                                                                                                                                                                                                        private int id;
                                                                                                                                                                                                                                                                                                                        /** Initialize your data structure here. */
                                                                                                                                                                                                                                                                                                                        public Twitter() {
                                                                                                                                                                                                                                                                                                                            posts = new HashMap<>();
                                                                                                                                                                                                                                                                                                                            follows = new HashMap<>();
                                                                                                                                                                                                                                                                                                                            id = 0;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Compose a new tweet. */
                                                                                                                                                                                                                                                                                                                        public void postTweet(int userId, int tweetId) {
                                                                                                                                                                                                                                                                                                                            if (!posts.containsKey(userId)) {
                                                                                                                                                                                                                                                                                                                                posts.put(userId, new ArrayList<>());
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            posts.get(userId).add(new Data(id++, tweetId));
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. */
                                                                                                                                                                                                                                                                                                                        public List<Integer> getNewsFeed(int userId) {
                                                                                                                                                                                                                                                                                                                            PriorityQueue<Data> queue = new PriorityQueue<>(10, new Comparator<Data>() {
                                                                                                                                                                                                                                                                                                                                @Override
                                                                                                                                                                                                                                                                                                                                public int compare(Data o1, Data o2) {
                                                                                                                                                                                                                                                                                                                                    return Integer.compare(o2.id, o1.id);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            });
                                                                                                                                                                                                                                                                                                                            List<Data> ps = posts.get(userId);
                                                                                                                                                                                                                                                                                                                            if (ps != null) {
                                                                                                                                                                                                                                                                                                                                for (Data data : ps) {
                                                                                                                                                                                                                                                                                                                                    queue.offer(data);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            Set<Integer> fs = follows.get(userId);
                                                                                                                                                                                                                                                                                                                            if (fs != null) {
                                                                                                                                                                                                                                                                                                                                for (int f : fs) {
                                                                                                                                                                                                                                                                                                                                    ps = posts.get(f);
                                                                                                                                                                                                                                                                                                                                    if (ps != null) {
                                                                                                                                                                                                                                                                                                                                        for (Data data : ps) {
                                                                                                                                                                                                                                                                                                                                            queue.offer(data);
                                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            List<Integer> res = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < 10 && !queue.isEmpty(); ++i) {
                                                                                                                                                                                                                                                                                                                                res.add(queue.poll().tweetId);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Follower follows a followee. If the operation is invalid, it should be a no-op. */
                                                                                                                                                                                                                                                                                                                        public void follow(int followerId, intg followeeId) {
                                                                                                                                                                                                                                                                                                                            if (followerId != followeeId) {
                                                                                                                                                                                                                                                                                                                                if (!follows.containsKey(followerId)) {
                                                                                                                                                                                                                                                                                                                                    follows.put(followerId, new HashSet<>());
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                follows.get(followerId).add(followeeId);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Follower unfollows a followee. If the operation is invalid, it should be a no-op. */
                                                                                                                                                                                                                                                                                                                        public void unfollow(int followerId, int followeeId) {
                                                                                                                                                                                                                                                                                                                            if (follows.containsKey(followerId)) {
                                                                                                                                                                                                                                                                                                                                follows.get(followerId).remove(followeeId);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                                                                    • 45
                                                                                                                                                                                                                                                                                                                    • 46
                                                                                                                                                                                                                                                                                                                    • 47
                                                                                                                                                                                                                                                                                                                    • 48
                                                                                                                                                                                                                                                                                                                    • 49
                                                                                                                                                                                                                                                                                                                    • 50
                                                                                                                                                                                                                                                                                                                    • 51
                                                                                                                                                                                                                                                                                                                    • 52
                                                                                                                                                                                                                                                                                                                    • 53
                                                                                                                                                                                                                                                                                                                    • 54
                                                                                                                                                                                                                                                                                                                    • 55
                                                                                                                                                                                                                                                                                                                    • 56
                                                                                                                                                                                                                                                                                                                    • 57
                                                                                                                                                                                                                                                                                                                    • 58
                                                                                                                                                                                                                                                                                                                    • 59
                                                                                                                                                                                                                                                                                                                    • 60
                                                                                                                                                                                                                                                                                                                    • 61
                                                                                                                                                                                                                                                                                                                    • 62
                                                                                                                                                                                                                                                                                                                    • 63
                                                                                                                                                                                                                                                                                                                    • 64
                                                                                                                                                                                                                                                                                                                    • 65
                                                                                                                                                                                                                                                                                                                    • 66
                                                                                                                                                                                                                                                                                                                    • 67
                                                                                                                                                                                                                                                                                                                    • 68
                                                                                                                                                                                                                                                                                                                    • 69
                                                                                                                                                                                                                                                                                                                    • 70
                                                                                                                                                                                                                                                                                                                    • 71

                                                                                                                                                                                                                                                                                                                    367. 有效的完全平方数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。

                                                                                                                                                                                                                                                                                                                    说明:不要使用任何内置的库函数,如  sqrt

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:16
                                                                                                                                                                                                                                                                                                                    输出:True

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:14
                                                                                                                                                                                                                                                                                                                    输出:False
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean isPerfectSquare(int num) {
                                                                                                                                                                                                                                                                                                                            long r = num;
                                                                                                                                                                                                                                                                                                                            while (r * r > num) {
                                                                                                                                                                                                                                                                                                                                r = (r + num / r) / 2;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return r * r == num;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9

                                                                                                                                                                                                                                                                                                                    371. 两整数之和

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    不使用运算符 + 和 - ,计算两整数 a 、b 之和。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: a = 1, b = 2
                                                                                                                                                                                                                                                                                                                    输出: 3
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: a = -2, b = 3
                                                                                                                                                                                                                                                                                                                    输出: 1

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int getSum(int a, int b) {
                                                                                                                                                                                                                                                                                                                            return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5

                                                                                                                                                                                                                                                                                                                    374. 猜数字大小

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    我们正在玩一个猜数字游戏。 游戏规则如下:
                                                                                                                                                                                                                                                                                                                    我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。
                                                                                                                                                                                                                                                                                                                    每次你猜错了,我会告诉你这个数字是大了还是小了。
                                                                                                                                                                                                                                                                                                                    你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-11 或 0):

                                                                                                                                                                                                                                                                                                                    -1 : 我的数字比较小
                                                                                                                                                                                                                                                                                                                     1 : 我的数字比较大
                                                                                                                                                                                                                                                                                                                     0 : 恭喜!你猜对了!
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 :

                                                                                                                                                                                                                                                                                                                    输入: n = 10, pick = 6
                                                                                                                                                                                                                                                                                                                    输出: 6

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    public class Solution extends GuessGame {
                                                                                                                                                                                                                                                                                                                        public int guessNumber(int n) {
                                                                                                                                                                                                                                                                                                                            int l = 1, r = n;
                                                                                                                                                                                                                                                                                                                            while (l < r) {
                                                                                                                                                                                                                                                                                                                                int mid = l + r >>> 1;
                                                                                                                                                                                                                                                                                                                                if (guess(mid) <= 0) r = mid;
                                                                                                                                                                                                                                                                                                                                else l = mid + 1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return r;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11

                                                                                                                                                                                                                                                                                                                    376. 摆动序列

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

                                                                                                                                                                                                                                                                                                                    例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

                                                                                                                                                                                                                                                                                                                    给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1,7,4,9,2,5]
                                                                                                                                                                                                                                                                                                                    输出: 6 
                                                                                                                                                                                                                                                                                                                    解释: 整个序列均为摆动序列。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [1,17,5,10,13,15,10,5,16,8]
                                                                                                                                                                                                                                                                                                                    输出: 7
                                                                                                                                                                                                                                                                                                                    解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入: [1,2,3,4,5,6,7,8,9]
                                                                                                                                                                                                                                                                                                                    输出: 2

                                                                                                                                                                                                                                                                                                                    进阶:
                                                                                                                                                                                                                                                                                                                    你能否用 O(n) 时间复杂度完成此题?

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int wiggleMaxLength(int[] nums) {
                                                                                                                                                                                                                                                                                                                            if (nums.length < 2) {
                                                                                                                                                                                                                                                                                                                                return nums.length;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int up = 1;
                                                                                                                                                                                                                                                                                                                            int down = 1;
                                                                                                                                                                                                                                                                                                                            for (int i = 1; i < nums.length; ++i) {
                                                                                                                                                                                                                                                                                                                                if (nums[i] > nums[i - 1]) {
                                                                                                                                                                                                                                                                                                                                    up = down + 1;
                                                                                                                                                                                                                                                                                                                                } else if (nums[i] < nums[i - 1]) {
                                                                                                                                                                                                                                                                                                                                    down = up + 1;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return Math.max(up, down);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17

                                                                                                                                                                                                                                                                                                                    377. 组合总和 Ⅳ

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    nums = [1, 2, 3]
                                                                                                                                                                                                                                                                                                                    target = 4
                                                                                                                                                                                                                                                                                                                    所有可能的组合为:
                                                                                                                                                                                                                                                                                                                    (1, 1, 1, 1)
                                                                                                                                                                                                                                                                                                                    (1, 1, 2)
                                                                                                                                                                                                                                                                                                                    (1, 2, 1)
                                                                                                                                                                                                                                                                                                                    (1, 3)
                                                                                                                                                                                                                                                                                                                    (2, 1, 1)
                                                                                                                                                                                                                                                                                                                    (2, 2)
                                                                                                                                                                                                                                                                                                                    (3, 1)
                                                                                                                                                                                                                                                                                                                    请注意,顺序不同的序列被视作不同的组合。
                                                                                                                                                                                                                                                                                                                    因此输出为 7

                                                                                                                                                                                                                                                                                                                    进阶:
                                                                                                                                                                                                                                                                                                                    如果给定的数组中含有负数会怎么样?
                                                                                                                                                                                                                                                                                                                    问题会产生什么变化?
                                                                                                                                                                                                                                                                                                                    我们需要在题目中添加什么限制来允许负数的出现?

                                                                                                                                                                                                                                                                                                                    致谢:
                                                                                                                                                                                                                                                                                                                    特别感谢 @pbrother 添加此问题并创建所有测试用例。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                            public int combinationSum4(int[] n, int target) {
                                                                                                                                                                                                                                                                                                                            int[] dp = new int[target + 1];
                                                                                                                                                                                                                                                                                                                            Arrays.fill(dp, -1);
                                                                                                                                                                                                                                                                                                                            dp[0] = 1;
                                                                                                                                                                                                                                                                                                                            return combinationSum4Dfs(n, dp, target);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private int combinationSum4Dfs(int[] n, int[] dp, int target) {
                                                                                                                                                                                                                                                                                                                            if (target < 0) {
                                                                                                                                                                                                                                                                                                                                return 0;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (dp[target] != -1) {
                                                                                                                                                                                                                                                                                                                                return dp[target];
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int rt = 0;
                                                                                                                                                                                                                                                                                                                            for (int v : n) {
                                                                                                                                                                                                                                                                                                                                rt += combinationSum4Dfs(n, dp, target - v);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            dp[target] = rt;
                                                                                                                                                                                                                                                                                                                            return dp[target];
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22

                                                                                                                                                                                                                                                                                                                    378. 有序矩阵中第 K 小的元素

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
                                                                                                                                                                                                                                                                                                                    请注意,它是排序后的第k小元素,而不是第k个元素。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    matrix = [
                                                                                                                                                                                                                                                                                                                       [ 1,  5,  9],
                                                                                                                                                                                                                                                                                                                       [10, 11, 13],
                                                                                                                                                                                                                                                                                                                       [12, 13, 15]
                                                                                                                                                                                                                                                                                                                    ],
                                                                                                                                                                                                                                                                                                                    k = 8,
                                                                                                                                                                                                                                                                                                                    返回 13。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    说明:
                                                                                                                                                                                                                                                                                                                    你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int kthSmallest(int[][] matrix, int k) {
                                                                                                                                                                                                                                                                                                                            int len = matrix.length;
                                                                                                                                                                                                                                                                                                                            int min = matrix[0][0], max = matrix[len - 1][len - 1];
                                                                                                                                                                                                                                                                                                                            while (min < max) {
                                                                                                                                                                                                                                                                                                                                int mid = min + ((max - min) >> 1);
                                                                                                                                                                                                                                                                                                                                if (check(matrix, mid, k, len)) {
                                                                                                                                                                                                                                                                                                                                    max = mid;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    min = mid + 1;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return min;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private boolean check(int[][] matrix, int mid, int k, int n) {
                                                                                                                                                                                                                                                                                                                            // 从左下角走起
                                                                                                                                                                                                                                                                                                                            int i = n - 1;
                                                                                                                                                                                                                                                                                                                            int j = 0;
                                                                                                                                                                                                                                                                                                                            int num = 0;
                                                                                                                                                                                                                                                                                                                            while (i >= 0 && j < n) {
                                                                                                                                                                                                                                                                                                                                if (matrix[i][j] <= mid) {
                                                                                                                                                                                                                                                                                                                                    num += i + 1;
                                                                                                                                                                                                                                                                                                                                    j++;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    i--;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return num >= k;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30

                                                                                                                                                                                                                                                                                                                    380. 常数时间插入、删除和获取随机元素

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。

                                                                                                                                                                                                                                                                                                                    1. insert(val):当元素 val 不存在时,向集合中插入该项。
                                                                                                                                                                                                                                                                                                                    2. remove(val):元素 val 存在时,从集合中移除该项。
                                                                                                                                                                                                                                                                                                                    3. getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。

                                                                                                                                                                                                                                                                                                                    示例 :

                                                                                                                                                                                                                                                                                                                    // 初始化一个空的集合。
                                                                                                                                                                                                                                                                                                                    RandomizedSet randomSet = new RandomizedSet();
                                                                                                                                                                                                                                                                                                                    // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
                                                                                                                                                                                                                                                                                                                    randomSet.insert(1);
                                                                                                                                                                                                                                                                                                                    // 返回 false ,表示集合中不存在 2 。
                                                                                                                                                                                                                                                                                                                    randomSet.remove(2);
                                                                                                                                                                                                                                                                                                                    // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
                                                                                                                                                                                                                                                                                                                    randomSet.insert(2);
                                                                                                                                                                                                                                                                                                                    // getRandom 应随机返回 1 或 2 。
                                                                                                                                                                                                                                                                                                                    randomSet.getRandom();
                                                                                                                                                                                                                                                                                                                    // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
                                                                                                                                                                                                                                                                                                                    randomSet.remove(1);
                                                                                                                                                                                                                                                                                                                    // 2 已在集合中,所以返回 false 。
                                                                                                                                                                                                                                                                                                                    randomSet.insert(2);
                                                                                                                                                                                                                                                                                                                    // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
                                                                                                                                                                                                                                                                                                                    randomSet.getRandom();
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class RandomizedSet {
                                                                                                                                                                                                                                                                                                                    	private List<Integer> list;
                                                                                                                                                                                                                                                                                                                    	private Map<Integer, Integer> map;
                                                                                                                                                                                                                                                                                                                    	private Random random;
                                                                                                                                                                                                                                                                                                                    	/** Initialize your data structure here. */
                                                                                                                                                                                                                                                                                                                    	public RandomizedSet() {
                                                                                                                                                                                                                                                                                                                    		list = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                    		map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                    		random = new Random();
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/**
                                                                                                                                                                                                                                                                                                                    	 * Inserts a value to the set. Returns true if the set did not already contain
                                                                                                                                                                                                                                                                                                                    	 * the specified element.
                                                                                                                                                                                                                                                                                                                    	 */
                                                                                                                                                                                                                                                                                                                    	public boolean insert(int val) {
                                                                                                                                                                                                                                                                                                                    		if (map.containsKey(val)) {
                                                                                                                                                                                                                                                                                                                    			return false;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		list.add(val);
                                                                                                                                                                                                                                                                                                                    		map.put(val, list.size() - 1);
                                                                                                                                                                                                                                                                                                                    		return true;
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/**
                                                                                                                                                                                                                                                                                                                    	 * Removes a value from the set. Returns true if the set contained the specified
                                                                                                                                                                                                                                                                                                                    	 * element.
                                                                                                                                                                                                                                                                                                                    	 */
                                                                                                                                                                                                                                                                                                                    	public boolean remove(int val) {
                                                                                                                                                                                                                                                                                                                    		if (!map.containsKey(val)) {
                                                                                                                                                                                                                                                                                                                    			return false;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		int index = map.get(val);
                                                                                                                                                                                                                                                                                                                    		list.set(index, list.get(list.size() - 1));
                                                                                                                                                                                                                                                                                                                    		map.put(list.get(index), index);
                                                                                                                                                                                                                                                                                                                    		map.remove(val);
                                                                                                                                                                                                                                                                                                                    		list.remove(list.size() - 1);
                                                                                                                                                                                                                                                                                                                    		return true;
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/** Get a random element from the set. */
                                                                                                                                                                                                                                                                                                                    	public int getRandom() {
                                                                                                                                                                                                                                                                                                                    		if (list.size() == 0) {
                                                                                                                                                                                                                                                                                                                    			return 0;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		return list.get(random.nextInt(list.size()));
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                                                                    • 45

                                                                                                                                                                                                                                                                                                                    381. O(1) 时间插入、删除和获取随机元素 - 允许重复

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    设计一个支持在平均 时间复杂度 O(1) , 执行以下操作的数据结构。

                                                                                                                                                                                                                                                                                                                    注意: 允许出现重复元素。

                                                                                                                                                                                                                                                                                                                    1. insert(val):向集合中插入元素 val。
                                                                                                                                                                                                                                                                                                                    2. remove(val):当 val 存在时,从集合中移除一个 val。
                                                                                                                                                                                                                                                                                                                    3. getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    // 初始化一个空的集合。
                                                                                                                                                                                                                                                                                                                    RandomizedCollection collection = new RandomizedCollection();
                                                                                                                                                                                                                                                                                                                    // 向集合中插入 1 。返回 true 表示集合不包含 1 。
                                                                                                                                                                                                                                                                                                                    collection.insert(1);
                                                                                                                                                                                                                                                                                                                    // 向集合中插入另一个 1 。返回 false 表示集合包含 1 。集合现在包含 [1,1] 。
                                                                                                                                                                                                                                                                                                                    collection.insert(1);
                                                                                                                                                                                                                                                                                                                    // 向集合中插入 2 ,返回 true 。集合现在包含 [1,1,2] 。
                                                                                                                                                                                                                                                                                                                    collection.insert(2);
                                                                                                                                                                                                                                                                                                                    // getRandom 应当有 2/3 的概率返回 1 ,1/3 的概率返回 2 。
                                                                                                                                                                                                                                                                                                                    collection.getRandom();
                                                                                                                                                                                                                                                                                                                    // 从集合中删除 1 ,返回 true 。集合现在包含 [1,2] 。
                                                                                                                                                                                                                                                                                                                    collection.remove(1);
                                                                                                                                                                                                                                                                                                                    // getRandom 应有相同概率返回 1 和 2 。
                                                                                                                                                                                                                                                                                                                    collection.getRandom();
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class RandomizedCollection {
                                                                                                                                                                                                                                                                                                                    	private List<Integer> list;
                                                                                                                                                                                                                                                                                                                    	private Map<Integer, Set<Integer>> map;
                                                                                                                                                                                                                                                                                                                    	private Random random;
                                                                                                                                                                                                                                                                                                                    	/** Initialize your data structure here. */
                                                                                                                                                                                                                                                                                                                    	public RandomizedCollection() {
                                                                                                                                                                                                                                                                                                                    		list = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                    		map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                    		random = new Random();
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/**
                                                                                                                                                                                                                                                                                                                    	 * Inserts a value to the set. Returns true if the set did not already contain
                                                                                                                                                                                                                                                                                                                    	 * the specified element.
                                                                                                                                                                                                                                                                                                                    	 */
                                                                                                                                                                                                                                                                                                                    	public boolean insert(int val) {
                                                                                                                                                                                                                                                                                                                    		boolean flag = false;
                                                                                                                                                                                                                                                                                                                    		if (!map.containsKey(val)) {
                                                                                                                                                                                                                                                                                                                    			flag = true;
                                                                                                                                                                                                                                                                                                                    			map.put(val, new HashSet<Integer>());
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		map.get(val).add(list.size());
                                                                                                                                                                                                                                                                                                                    		list.add(val);
                                                                                                                                                                                                                                                                                                                    		return flag;
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/**
                                                                                                                                                                                                                                                                                                                    	 * Removes a value from the set. Returns true if the set contained the specified
                                                                                                                                                                                                                                                                                                                    	 * element.
                                                                                                                                                                                                                                                                                                                    	 */
                                                                                                                                                                                                                                                                                                                    	public boolean remove(int val) {
                                                                                                                                                                                                                                                                                                                    		if (!map.containsKey(val)) {
                                                                                                                                                                                                                                                                                                                    			return false;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		int removed = map.get(val).iterator().next();
                                                                                                                                                                                                                                                                                                                    		map.get(val).remove(removed);
                                                                                                                                                                                                                                                                                                                    		if (removed < list.size() - 1) {
                                                                                                                                                                                                                                                                                                                    			Integer tail = list.get(list.size() - 1);
                                                                                                                                                                                                                                                                                                                    			list.set(removed, tail);
                                                                                                                                                                                                                                                                                                                    			map.get(tail).remove(list.size() - 1);
                                                                                                                                                                                                                                                                                                                    			map.get(tail).add(removed);
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		list.remove(list.size() - 1);
                                                                                                                                                                                                                                                                                                                    		if (map.get(val).size() == 0) {
                                                                                                                                                                                                                                                                                                                    			map.remove(val);
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		return true;
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    	/** Get a random element from the set. */
                                                                                                                                                                                                                                                                                                                    	public int getRandom() {
                                                                                                                                                                                                                                                                                                                    		if (list.size() == 0) {
                                                                                                                                                                                                                                                                                                                    			return 0;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                    		return list.get(random.nextInt(list.size()));
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Your RandomizedCollection object will be instantiated and called as such:
                                                                                                                                                                                                                                                                                                                     * RandomizedCollection obj = new RandomizedCollection();
                                                                                                                                                                                                                                                                                                                     * boolean param_1 = obj.insert(val);
                                                                                                                                                                                                                                                                                                                     * boolean param_2 = obj.remove(val);
                                                                                                                                                                                                                                                                                                                     * int param_3 = obj.getRandom();
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                                                                    • 45
                                                                                                                                                                                                                                                                                                                    • 46
                                                                                                                                                                                                                                                                                                                    • 47
                                                                                                                                                                                                                                                                                                                    • 48
                                                                                                                                                                                                                                                                                                                    • 49
                                                                                                                                                                                                                                                                                                                    • 50
                                                                                                                                                                                                                                                                                                                    • 51
                                                                                                                                                                                                                                                                                                                    • 52
                                                                                                                                                                                                                                                                                                                    • 53
                                                                                                                                                                                                                                                                                                                    • 54
                                                                                                                                                                                                                                                                                                                    • 55
                                                                                                                                                                                                                                                                                                                    • 56
                                                                                                                                                                                                                                                                                                                    • 57
                                                                                                                                                                                                                                                                                                                    • 58
                                                                                                                                                                                                                                                                                                                    • 59
                                                                                                                                                                                                                                                                                                                    • 60
                                                                                                                                                                                                                                                                                                                    • 61

                                                                                                                                                                                                                                                                                                                    383. 赎金信

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。

                                                                                                                                                                                                                                                                                                                    (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    你可以假设两个字符串均只含有小写字母。

                                                                                                                                                                                                                                                                                                                    canConstruct("a", "b") -> false
                                                                                                                                                                                                                                                                                                                    canConstruct("aa", "ab") -> false
                                                                                                                                                                                                                                                                                                                    canConstruct("aa", "aab") -> true
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    用一个数组或字典 chars 存放 magazine 中每个字母出现的次数。遍历 ransomNote 中每个字母,判断 chars 是否包含即可。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean canConstruct(String ransomNote, String magazine) {
                                                                                                                                                                                                                                                                                                                            int[] chars = new int[26];
                                                                                                                                                                                                                                                                                                                            for (int i = 0, n = magazine.length(); i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                int idx = magazine.charAt(i) - 'a';
                                                                                                                                                                                                                                                                                                                                ++chars[idx];
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (int i = 0, n = ransomNote.length(); i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                int idx = ransomNote.charAt(i) - 'a';
                                                                                                                                                                                                                                                                                                                                if (chars[idx] == 0) return false;
                                                                                                                                                                                                                                                                                                                                --chars[idx];
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return true;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15

                                                                                                                                                                                                                                                                                                                    384. 打乱数组

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    打乱一个没有重复元素的数组。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    // 以数字集合 1, 2 和 3 初始化数组。
                                                                                                                                                                                                                                                                                                                    int[] nums = {1,2,3};
                                                                                                                                                                                                                                                                                                                    Solution solution = new Solution(nums);
                                                                                                                                                                                                                                                                                                                    // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
                                                                                                                                                                                                                                                                                                                    solution.shuffle();
                                                                                                                                                                                                                                                                                                                    // 重设数组到它的初始状态[1,2,3]。
                                                                                                                                                                                                                                                                                                                    solution.reset();
                                                                                                                                                                                                                                                                                                                    // 随机返回数组[1,2,3]打乱后的结果。
                                                                                                                                                                                                                                                                                                                    solution.shuffle();
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        private int[] src;
                                                                                                                                                                                                                                                                                                                        private int[] arr;
                                                                                                                                                                                                                                                                                                                        private Random random;
                                                                                                                                                                                                                                                                                                                        public Solution(int[] nums) {
                                                                                                                                                                                                                                                                                                                            src = nums;
                                                                                                                                                                                                                                                                                                                            arr = Arrays.copyOf(src, src.length);
                                                                                                                                                                                                                                                                                                                            random = new Random();
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Resets the array to its original configuration and return it. */
                                                                                                                                                                                                                                                                                                                        public int[] reset() {
                                                                                                                                                                                                                                                                                                                            return src;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        /** Returns a random shuffling of the array. */
                                                                                                                                                                                                                                                                                                                        public int[] shuffle() {
                                                                                                                                                                                                                                                                                                                            for (int i = arr.length - 1; i >= 0; --i) {
                                                                                                                                                                                                                                                                                                                                swap(i, random.nextInt(i + 1));
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return arr;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private void swap(int i, int j) {
                                                                                                                                                                                                                                                                                                                            int tmp = arr[i];
                                                                                                                                                                                                                                                                                                                            arr[i] = arr[j];
                                                                                                                                                                                                                                                                                                                            arr[j] = tmp;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26

                                                                                                                                                                                                                                                                                                                    387. 字符串中的第一个唯一字符

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

                                                                                                                                                                                                                                                                                                                    案例:

                                                                                                                                                                                                                                                                                                                    s = "leetcode"
                                                                                                                                                                                                                                                                                                                    返回 0.
                                                                                                                                                                                                                                                                                                                    s = "loveleetcode",
                                                                                                                                                                                                                                                                                                                    返回 2.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    注意事项:您可以假定该字符串只包含小写字母。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    遍历字符串,用一个 map 或者字典存放字符串中每个字符出现的次数。然后再次遍历字符串,取出对应字符出现的次数,若次数为 1,直接返回当前字符串的下标。遍历结束,返回 -1。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int firstUniqChar(String s) {
                                                                                                                                                                                                                                                                                                                            Map<Character, Integer> chars = new HashMap<>(26);
                                                                                                                                                                                                                                                                                                                            int n = s.length();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                char ch = s.charAt(i);
                                                                                                                                                                                                                                                                                                                                chars.put(ch, chars.getOrDefault(ch, 0) + 1);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                char ch = s.charAt(i);
                                                                                                                                                                                                                                                                                                                                if (chars.get(ch) == 1) return i;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return -1;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15

                                                                                                                                                                                                                                                                                                                    392. 判断子序列

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定字符串 st ,判断 s 是否为 t 的子序列。

                                                                                                                                                                                                                                                                                                                    你可以认为 st 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

                                                                                                                                                                                                                                                                                                                    字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。

                                                                                                                                                                                                                                                                                                                    示例 1:
                                                                                                                                                                                                                                                                                                                    s = "abc", t = "ahbgdc"

                                                                                                                                                                                                                                                                                                                    返回 true.

                                                                                                                                                                                                                                                                                                                    示例 2:
                                                                                                                                                                                                                                                                                                                    s = "axc", t = "ahbgdc"

                                                                                                                                                                                                                                                                                                                    返回 false.

                                                                                                                                                                                                                                                                                                                    后续挑战 :

                                                                                                                                                                                                                                                                                                                    如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

                                                                                                                                                                                                                                                                                                                    致谢:

                                                                                                                                                                                                                                                                                                                    特别感谢 @pbrother 添加此问题并且创建所有测试用例。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    双指针遍历即可。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean isSubsequence(String s, String t) {
                                                                                                                                                                                                                                                                                                                            int m = s.length(), n = t.length();
                                                                                                                                                                                                                                                                                                                            int i = 0, j = 0;
                                                                                                                                                                                                                                                                                                                            while (i < m && j < n) {
                                                                                                                                                                                                                                                                                                                                if (s.charAt(i) == t.charAt(j)) {
                                                                                                                                                                                                                                                                                                                                    ++i;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                ++j;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return i == m;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13

                                                                                                                                                                                                                                                                                                                    394. 字符串解码

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个经过编码的字符串,返回它解码后的字符串。

                                                                                                                                                                                                                                                                                                                    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

                                                                                                                                                                                                                                                                                                                    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

                                                                                                                                                                                                                                                                                                                    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    s = "3[a]2[bc]", 返回 "aaabcbc".
                                                                                                                                                                                                                                                                                                                    s = "3[a2[c]]", 返回 "accaccacc".
                                                                                                                                                                                                                                                                                                                    s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String decodeString(String s) {
                                                                                                                                                                                                                                                                                                                            char[] chars = s.toCharArray();
                                                                                                                                                                                                                                                                                                                            Stack<Character> stack = new Stack<>();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < chars.length; i++) {
                                                                                                                                                                                                                                                                                                                                if (chars[i] != ']') {
                                                                                                                                                                                                                                                                                                                                    stack.push(chars[i]);
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    // 找[]内的内容
                                                                                                                                                                                                                                                                                                                                    String t = "";
                                                                                                                                                                                                                                                                                                                                    while (stack.peek() != '[') {
                                                                                                                                                                                                                                                                                                                                        t = stack.pop() + t;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                    // 弹出[
                                                                                                                                                                                                                                                                                                                                    stack.pop();
                                                                                                                                                                                                                                                                                                                                    // 找前面的数字
                                                                                                                                                                                                                                                                                                                                    String n = "";
                                                                                                                                                                                                                                                                                                                                    while (!stack.isEmpty() && stack.peek() >= '0' && stack.peek() <= '9') {
                                                                                                                                                                                                                                                                                                                                        n = stack.pop() + n;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                    int c = Integer.valueOf(n);
                                                                                                                                                                                                                                                                                                                                    String tmpCombine = "";
                                                                                                                                                                                                                                                                                                                                    // 把字母重复c次
                                                                                                                                                                                                                                                                                                                                    for (int j = 0; j < c; j++) {
                                                                                                                                                                                                                                                                                                                                        tmpCombine += t;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                    // 放回stack
                                                                                                                                                                                                                                                                                                                                    char[] tmp = tmpCombine.toCharArray();
                                                                                                                                                                                                                                                                                                                                    for (int j = 0; j < tmp.length; j++) {
                                                                                                                                                                                                                                                                                                                                        stack.push(tmp[j]);
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            // stack即为结果
                                                                                                                                                                                                                                                                                                                            String ans = "";
                                                                                                                                                                                                                                                                                                                            while (!stack.isEmpty()) {
                                                                                                                                                                                                                                                                                                                                ans = stack.pop() + ans;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return ans;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41

                                                                                                                                                                                                                                                                                                                    397. 整数替换

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个正整数 n,你可以做如下操作:

                                                                                                                                                                                                                                                                                                                    1. 如果 是偶数,则用 n / 2替换 n
                                                                                                                                                                                                                                                                                                                    2. 如果 是奇数,则可以用 n + 1n - 1替换 n
                                                                                                                                                                                                                                                                                                                    变为 1 所需的最小替换次数是多少?

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    8
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    3
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    8 -> 4 -> 2 -> 1
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    7
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    4
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    7 -> 8 -> 4 -> 2 -> 1
                                                                                                                                                                                                                                                                                                                    或
                                                                                                                                                                                                                                                                                                                    7 -> 6 -> 3 -> 2 -> 1
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int integerReplacement(int n) {
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            while (n != 1) {
                                                                                                                                                                                                                                                                                                                                if ((n & 1) == 0) {
                                                                                                                                                                                                                                                                                                                                    n >>>= 1;
                                                                                                                                                                                                                                                                                                                                } else if (n != 3 && (n & 3) == 3) {
                                                                                                                                                                                                                                                                                                                                    ++n;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    --n;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                ++res;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    400. 第 N 个数字

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 个数字。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    是正数且在32为整形范围内 ( n < 231)。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    3
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    3
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    11
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    0
                                                                                                                                                                                                                                                                                                                    说明:
                                                                                                                                                                                                                                                                                                                    第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        /***
                                                                                                                                                                                                                                                                                                                         * 12345678910111213
                                                                                                                                                                                                                                                                                                                         * 规律个位数9个数一共有9*1,两位数90个数 一共有90*2个数字,三位数有900个数一共有900*3个数字,以此类推
                                                                                                                                                                                                                                                                                                                         * 举例15,15-9=6,6/2=3...0,余数是0,那么这个数值value=10*(2-1)+(3-1)=12,整除取最后一位  12%10=2
                                                                                                                                                                                                                                                                                                                         * 举例14,14-9=5,5/2=2...1,余数不为0,那么这个数值value=10*(2-1)+2=12,则为这个数的第余数个 12/(10*(2-1))%10=1
                                                                                                                                                                                                                                                                                                                         */
                                                                                                                                                                                                                                                                                                                        public int findNthDigit(int n) {
                                                                                                                                                                                                                                                                                                                            long max = 9;
                                                                                                                                                                                                                                                                                                                            long num = n;
                                                                                                                                                                                                                                                                                                                            long digits = 1;
                                                                                                                                                                                                                                                                                                                            while (n > 0) {
                                                                                                                                                                                                                                                                                                                                if (num - max * digits > 0) {
                                                                                                                                                                                                                                                                                                                                    num = num - max * digits;
                                                                                                                                                                                                                                                                                                                                    digits++;
                                                                                                                                                                                                                                                                                                                                    max = max * 10;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    long count = num / digits;
                                                                                                                                                                                                                                                                                                                                    long childDigits = num % digits;
                                                                                                                                                                                                                                                                                                                                    if (childDigits == 0) {
                                                                                                                                                                                                                                                                                                                                        return (int) (((long) Math.pow(10, digits - 1) + count - 1) % 10);
                                                                                                                                                                                                                                                                                                                                    } else {
                                                                                                                                                                                                                                                                                                                                        return (int) (((long) Math.pow(10, digits - 1) + count) / ((long) Math.pow(10, (digits - childDigits))) % 10);
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return 0;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29

                                                                                                                                                                                                                                                                                                                    401. 二进制手表

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)

                                                                                                                                                                                                                                                                                                                    每个 LED 代表一个 0 或 1,最低位在右侧。

                                                                                                                                                                                                                                                                                                                    例如,上面的二进制手表读取 “3:25”。

                                                                                                                                                                                                                                                                                                                    给定一个非负整数 代表当前 LED 亮着的数量,返回所有可能的时间。

                                                                                                                                                                                                                                                                                                                    案例:

                                                                                                                                                                                                                                                                                                                    输入: n = 1
                                                                                                                                                                                                                                                                                                                    返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    注意事项:

                                                                                                                                                                                                                                                                                                                    • 输出的顺序没有要求。
                                                                                                                                                                                                                                                                                                                    • 小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
                                                                                                                                                                                                                                                                                                                    • 分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public List<String> readBinaryWatch(int num) {
                                                                                                                                                                                                                                                                                                                            List<String> res = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < 12; ++i) {
                                                                                                                                                                                                                                                                                                                                for (int j = 0; j < 60; ++j) {
                                                                                                                                                                                                                                                                                                                                    if (Integer.bitCount(i) + Integer.bitCount(j) == num) {
                                                                                                                                                                                                                                                                                                                                        res.add(String.format("%d:%02d", i, j));
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13

                                                                                                                                                                                                                                                                                                                    402. 移掉 K 位数字

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    • num 的长度小于 10002 且 ≥ k。
                                                                                                                                                                                                                                                                                                                    • num 不会包含任何前导零。

                                                                                                                                                                                                                                                                                                                    示例 1 :

                                                                                                                                                                                                                                                                                                                    输入: num = "1432219", k = 3
                                                                                                                                                                                                                                                                                                                    输出: "1219"
                                                                                                                                                                                                                                                                                                                    解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2 :

                                                                                                                                                                                                                                                                                                                    输入: num = "10200", k = 1
                                                                                                                                                                                                                                                                                                                    输出: "200"
                                                                                                                                                                                                                                                                                                                    解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3 :

                                                                                                                                                                                                                                                                                                                    输入: num = "10", k = 2
                                                                                                                                                                                                                                                                                                                    输出: "0"
                                                                                                                                                                                                                                                                                                                    解释: 从原数字移除所有的数字,剩余为空就是0。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String removeKdigits(String num, int k) {
                                                                                                                                                                                                                                                                                                                            if (k <= 0) {
                                                                                                                                                                                                                                                                                                                                return num;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (num.length() <= k) {
                                                                                                                                                                                                                                                                                                                                return "0";
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int len = num.length() - k;
                                                                                                                                                                                                                                                                                                                            char[] cs = new char[num.length()];
                                                                                                                                                                                                                                                                                                                            int top = -1;
                                                                                                                                                                                                                                                                                                                            for (char c : num.toCharArray()) {
                                                                                                                                                                                                                                                                                                                                while (top >= 0 && cs[top] > c && k > 0) {
                                                                                                                                                                                                                                                                                                                                    --top;
                                                                                                                                                                                                                                                                                                                                    --k;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                cs[++top] = c;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int offset = 0;
                                                                                                                                                                                                                                                                                                                            while (offset <= top && cs[offset] == '0') {
                                                                                                                                                                                                                                                                                                                                ++offset;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return offset > top ? "0" : new String(cs, offset, len - offset);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25

                                                                                                                                                                                                                                                                                                                    404. 左叶子之和

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    计算给定二叉树的所有左叶子之和。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                        3
                                                                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                                                                      9  20
                                                                                                                                                                                                                                                                                                                        /  \
                                                                                                                                                                                                                                                                                                                       15   7
                                                                                                                                                                                                                                                                                                                    在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        private int sum = 0;
                                                                                                                                                                                                                                                                                                                        public int sumOfLeftLeaves(TreeNode root) {
                                                                                                                                                                                                                                                                                                                            if (root == null) return 0;
                                                                                                                                                                                                                                                                                                                            if (root.left != null && root.left.left == null && root.left.right == null) {
                                                                                                                                                                                                                                                                                                                                sum += root.left.val;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            sumOfLeftLeaves(root.left);
                                                                                                                                                                                                                                                                                                                            sumOfLeftLeaves(root.right);
                                                                                                                                                                                                                                                                                                                            return sum;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21

                                                                                                                                                                                                                                                                                                                    405. 数字转换为十六进制数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 十六进制中所有字母(a-f)都必须是小写。
                                                                                                                                                                                                                                                                                                                    2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 
                                                                                                                                                                                                                                                                                                                    3. 给定的数确保在32位有符号整数范围内。
                                                                                                                                                                                                                                                                                                                    4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    26
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    "1a"
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    -1
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    "ffffffff"
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String toHex(int num) {
                                                                                                                                                                                                                                                                                                                            if (num == 0) {
                                                                                                                                                                                                                                                                                                                                return "0";
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                                                                                                                                            while (num != 0) {
                                                                                                                                                                                                                                                                                                                                int x = num & 15;
                                                                                                                                                                                                                                                                                                                                if (x < 10) {
                                                                                                                                                                                                                                                                                                                                    sb.append(x);
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    sb.append((char) (x - 10 + 'a'));
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                num >>>= 4;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return sb.reverse().toString();
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18

                                                                                                                                                                                                                                                                                                                    406. 根据身高重建队列

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    总人数少于1100人。

                                                                                                                                                                                                                                                                                                                    示例

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int[][] reconstructQueue(int[][] people) {
                                                                                                                                                                                                                                                                                                                            Arrays.sort(people, (o1, o2) -> o1[0] != o2[0] ? Integer.compare(o2[0], o1[0]) : Integer.compare(o1[1], o2[1]));
                                                                                                                                                                                                                                                                                                                            List<int[]> res = new ArrayList<>(people.length);
                                                                                                                                                                                                                                                                                                                            for (int[] p : people) {
                                                                                                                                                                                                                                                                                                                                res.add(p[1], p);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res.toArray(new int[res.size()][]);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10

                                                                                                                                                                                                                                                                                                                    409. 最长回文串

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

                                                                                                                                                                                                                                                                                                                    在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    假设字符串的长度不会超过 1010。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    "abccccdd"
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    7
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int longestPalindrome(String s) {
                                                                                                                                                                                                                                                                                                                            int[] res = new int[128];
                                                                                                                                                                                                                                                                                                                            int n = s.length();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                res[s.charAt(i)]++;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int oddCnt = 0;
                                                                                                                                                                                                                                                                                                                            for (int e : res) {
                                                                                                                                                                                                                                                                                                                                oddCnt += (e % 2);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return oddCnt == 0 ? n : n - oddCnt + 1;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14

                                                                                                                                                                                                                                                                                                                    410. 分割数组的最大值

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非负整数数组和一个整数 m,你需要将这个数组分成 个非空的连续子数组。设计一个算法使得这 个子数组各自和的最大值最小。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    数组长度 满足以下条件:

                                                                                                                                                                                                                                                                                                                    • 1 ≤ n ≤ 1000
                                                                                                                                                                                                                                                                                                                    • 1 ≤ m ≤ min(50, n)

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    nums = [7,2,5,10,8]
                                                                                                                                                                                                                                                                                                                    m = 2
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    18
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    一共有四种方法将nums分割为2个子数组。
                                                                                                                                                                                                                                                                                                                    其中最好的方式是将其分为[7,2,5][10,8],
                                                                                                                                                                                                                                                                                                                    因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int splitArray(int[] nums, int m) {
                                                                                                                                                                                                                                                                                                                            long l = 0, r = 0;
                                                                                                                                                                                                                                                                                                                            for (int x : nums) {
                                                                                                                                                                                                                                                                                                                                l = Math.max(l, x);
                                                                                                                                                                                                                                                                                                                                r += x;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            while (l < r) {
                                                                                                                                                                                                                                                                                                                                long mid = l + r >>> 1;
                                                                                                                                                                                                                                                                                                                                if (check(nums, m, mid)) r = mid;
                                                                                                                                                                                                                                                                                                                                else l = mid + 1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return (int) r;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private boolean check(int[] nums, int m, long cap) {
                                                                                                                                                                                                                                                                                                                            int cnt = 1;
                                                                                                                                                                                                                                                                                                                            long tot = 0;
                                                                                                                                                                                                                                                                                                                            for (int x : nums) {
                                                                                                                                                                                                                                                                                                                                tot += x;
                                                                                                                                                                                                                                                                                                                                if (tot > cap) {
                                                                                                                                                                                                                                                                                                                                    ++cnt;
                                                                                                                                                                                                                                                                                                                                    tot = x;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return cnt <= m;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27

                                                                                                                                                                                                                                                                                                                    414. 第三大的数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [3, 2, 1]
                                                                                                                                                                                                                                                                                                                    输出: 1
                                                                                                                                                                                                                                                                                                                    解释: 第三大的数是 1.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [1, 2]
                                                                                                                                                                                                                                                                                                                    输出: 2
                                                                                                                                                                                                                                                                                                                    解释: 第三大的数不存在, 所以返回最大的数 2 .
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入: [2, 2, 3, 1]
                                                                                                                                                                                                                                                                                                                    输出: 1
                                                                                                                                                                                                                                                                                                                    解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
                                                                                                                                                                                                                                                                                                                    存在两个值为2的数,它们都排第二。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int thirdMax(int[] nums) {
                                                                                                                                                                                                                                                                                                                            long m1 = Long.MIN_VALUE;
                                                                                                                                                                                                                                                                                                                            long m2 = Long.MIN_VALUE;
                                                                                                                                                                                                                                                                                                                            long m3 = Long.MIN_VALUE;
                                                                                                                                                                                                                                                                                                                            for (int x : nums) {
                                                                                                                                                                                                                                                                                                                                if (x == m1 || x == m2 || x == m3) {
                                                                                                                                                                                                                                                                                                                                    continue;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                if (x > m1) {
                                                                                                                                                                                                                                                                                                                                    m3 = m2;
                                                                                                                                                                                                                                                                                                                                    m2 = m1;
                                                                                                                                                                                                                                                                                                                                    m1 = x;
                                                                                                                                                                                                                                                                                                                                } else if (x > m2) {
                                                                                                                                                                                                                                                                                                                                    m3 = m2;
                                                                                                                                                                                                                                                                                                                                    m2 = x;
                                                                                                                                                                                                                                                                                                                                } else if (x > m3) {
                                                                                                                                                                                                                                                                                                                                    m3 = x;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return (int) (m3 != Long.MIN_VALUE ? m3 : m1);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23

                                                                                                                                                                                                                                                                                                                    415. 字符串相加

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定两个字符串形式的非负整数 num1num2 ,计算它们的和。

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. num1num2 的长度都小于 5100.
                                                                                                                                                                                                                                                                                                                    2. num1num2 都只包含数字 0-9.
                                                                                                                                                                                                                                                                                                                    3. num1num2 都不包含任何前导零。
                                                                                                                                                                                                                                                                                                                    4. 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String addStrings(String num1, String num2) {
                                                                                                                                                                                                                                                                                                                            int i = num1.length() - 1;
                                                                                                                                                                                                                                                                                                                            int j = num2.length() - 1;
                                                                                                                                                                                                                                                                                                                            int carry = 0;
                                                                                                                                                                                                                                                                                                                            StringBuilder res = new StringBuilder();
                                                                                                                                                                                                                                                                                                                            while (i >= 0 || j >= 0 || carry != 0) {
                                                                                                                                                                                                                                                                                                                                carry += (i >= 0 ? num1.charAt(i--) - '0' : 0) + (j >= 0 ? num2.charAt(j--) - '0' : 0);
                                                                                                                                                                                                                                                                                                                                res.append(carry % 10);
                                                                                                                                                                                                                                                                                                                                carry /= 10;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res.reverse().toString();
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14

                                                                                                                                                                                                                                                                                                                    421. 数组中两个数的最大异或值

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 

                                                                                                                                                                                                                                                                                                                    找到 ai 和a最大的异或 (XOR) 运算结果,其中0 ≤ i,  j <

                                                                                                                                                                                                                                                                                                                    你能在O(n)的时间解决这个问题吗?

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: [3, 10, 5, 25, 2, 8]
                                                                                                                                                                                                                                                                                                                    输出: 28
                                                                                                                                                                                                                                                                                                                    解释: 最大的结果是 5 ^ 25 = 28.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findMaximumXOR(int[] numbers) {
                                                                                                                                                                                                                                                                                                                            int max = 0;
                                                                                                                                                                                                                                                                                                                            int mask = 0;
                                                                                                                                                                                                                                                                                                                            for (int i = 30; i >= 0; i--) {
                                                                                                                                                                                                                                                                                                                                int current = 1 << i;
                                                                                                                                                                                                                                                                                                                                // 期望的二进制前缀
                                                                                                                                                                                                                                                                                                                                mask = mask ^ current;
                                                                                                                                                                                                                                                                                                                                // 在当前前缀下, 数组内的前缀位数所有情况集合
                                                                                                                                                                                                                                                                                                                                Set<Integer> set = new HashSet<>();
                                                                                                                                                                                                                                                                                                                                for (int j = 0, k = numbers.length; j < k; j++) {
                                                                                                                                                                                                                                                                                                                                    set.add(mask & numbers[j]);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                // 期望最终异或值的从右数第i位为1, 再根据异或运算的特性推算假设是否成立
                                                                                                                                                                                                                                                                                                                                int flag = max | current;
                                                                                                                                                                                                                                                                                                                                for (Integer prefix : set) {
                                                                                                                                                                                                                                                                                                                                    if (set.contains(prefix ^ flag)) {
                                                                                                                                                                                                                                                                                                                                        max = flag;
                                                                                                                                                                                                                                                                                                                                        break;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return max;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25

                                                                                                                                                                                                                                                                                                                    424. 替换后的最长重复字符

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    字符串长度 和 k 不会超过 104

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    s = "ABAB", k = 2
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    4
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    用两个'A'替换为两个'B',反之亦然。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    s = "AABABBA", k = 1
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    4
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
                                                                                                                                                                                                                                                                                                                    子串 "BBBB" 有最长重复字母, 答案为 4。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int characterReplacement(String s, int k) {
                                                                                                                                                                                                                                                                                                                            char[] cs = s.toCharArray();
                                                                                                                                                                                                                                                                                                                            int[] map = new int[26];
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            int max = 0;
                                                                                                                                                                                                                                                                                                                            for (int l = 0, r = 0; r < cs.length; ) {
                                                                                                                                                                                                                                                                                                                                max = Math.max(max, ++map[cs[r++] - 'A']);
                                                                                                                                                                                                                                                                                                                                while (r - l - max > k) {
                                                                                                                                                                                                                                                                                                                                    --map[cs[l++] - 'A'];
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                res = Math.max(res, r - l);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    426. 将二叉搜索树转化为排序的双向链表

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表

                                                                                                                                                                                                                                                                                                                    对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

                                                                                                                                                                                                                                                                                                                    特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:root = [4,2,5,1,3] 

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                    输出:[1,2,3,4,5]
                                                                                                                                                                                                                                                                                                                    解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:root = [2,1,3]
                                                                                                                                                                                                                                                                                                                    输出:[1,2,3]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入:root = []
                                                                                                                                                                                                                                                                                                                    输出:[]
                                                                                                                                                                                                                                                                                                                    解释:输入是空树,所以输出也是空链表。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 4:

                                                                                                                                                                                                                                                                                                                    输入:root = [1]
                                                                                                                                                                                                                                                                                                                    输出:[1]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    • -1000 <= Node.val <= 1000
                                                                                                                                                                                                                                                                                                                    • Node.left.val < Node.val < Node.right.val
                                                                                                                                                                                                                                                                                                                    • Node.val 的所有值都是独一无二的
                                                                                                                                                                                                                                                                                                                    • 0 <= Number of Nodes <= 2000

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    • 排序链表:二叉搜索树中序遍历得到有序序列
                                                                                                                                                                                                                                                                                                                    • 循环链表:头节点指向链表尾节点,尾节点指向链表头节点
                                                                                                                                                                                                                                                                                                                    • 双向链表:pre.right = curcur.left = prepre = cur

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /*
                                                                                                                                                                                                                                                                                                                    // Definition for a Node.
                                                                                                                                                                                                                                                                                                                    class Node {
                                                                                                                                                                                                                                                                                                                        public int val;
                                                                                                                                                                                                                                                                                                                        public Node left;
                                                                                                                                                                                                                                                                                                                        public Node right;
                                                                                                                                                                                                                                                                                                                        public Node() {}
                                                                                                                                                                                                                                                                                                                        public Node(int _val) {
                                                                                                                                                                                                                                                                                                                            val = _val;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        public Node(int _val,Node _left,Node _right) {
                                                                                                                                                                                                                                                                                                                            val = _val;
                                                                                                                                                                                                                                                                                                                            left = _left;
                                                                                                                                                                                                                                                                                                                            right = _right;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    };
                                                                                                                                                                                                                                                                                                                    */
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        private Node head;
                                                                                                                                                                                                                                                                                                                        private Node pre;
                                                                                                                                                                                                                                                                                                                        public Node treeToDoublyList(Node root) {
                                                                                                                                                                                                                                                                                                                            if (root == null) return null;
                                                                                                                                                                                                                                                                                                                            dfs(root);
                                                                                                                                                                                                                                                                                                                            head.left = pre;
                                                                                                                                                                                                                                                                                                                            pre.right = head;
                                                                                                                                                                                                                                                                                                                            return head;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private void dfs(Node cur) {
                                                                                                                                                                                                                                                                                                                            if (cur == null) return;
                                                                                                                                                                                                                                                                                                                            dfs(cur.left);
                                                                                                                                                                                                                                                                                                                            if (pre == null) head = cur;
                                                                                                                                                                                                                                                                                                                            else pre.right = cur;
                                                                                                                                                                                                                                                                                                                            cur.left = pre;
                                                                                                                                                                                                                                                                                                                            pre = cur;
                                                                                                                                                                                                                                                                                                                            dfs(cur.right);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37

                                                                                                                                                                                                                                                                                                                    430. 扁平化多级双向链表

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

                                                                                                                                                                                                                                                                                                                    扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                     1---2---3---4---5---6--NULL
                                                                                                                                                                                                                                                                                                                             |
                                                                                                                                                                                                                                                                                                                             7---8---9---10--NULL
                                                                                                                                                                                                                                                                                                                                 |
                                                                                                                                                                                                                                                                                                                                 11--12--NULL
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    1-2-3-7-8-11-12-9-10-4-5-6-NULL
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    以上示例的说明:

                                                                                                                                                                                                                                                                                                                    给出以下多级双向链表:

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    我们应该返回如下所示的扁平双向链表:

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public Node flatten(Node head) {
                                                                                                                                                                                                                                                                                                                            if (head == null) {
                                                                                                                                                                                                                                                                                                                                return null;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            dfs(head);
                                                                                                                                                                                                                                                                                                                            head.prev = null;
                                                                                                                                                                                                                                                                                                                            return head;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private Node dfs(Node head) {
                                                                                                                                                                                                                                                                                                                            Node cur = head;
                                                                                                                                                                                                                                                                                                                            while (cur != null) {
                                                                                                                                                                                                                                                                                                                                head.prev = cur;
                                                                                                                                                                                                                                                                                                                                Node next = cur.next;
                                                                                                                                                                                                                                                                                                                                if (cur.child != null) {
                                                                                                                                                                                                                                                                                                                                    Node h = dfs(cur.child);
                                                                                                                                                                                                                                                                                                                                    cur.child = null;
                                                                                                                                                                                                                                                                                                                                    Node t = h.prev;
                                                                                                                                                                                                                                                                                                                                    cur.next = h;
                                                                                                                                                                                                                                                                                                                                    h.prev = cur;
                                                                                                                                                                                                                                                                                                                                    t.next = next;
                                                                                                                                                                                                                                                                                                                                    if (next != null) {
                                                                                                                                                                                                                                                                                                                                        next.prev = t;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                    head.prev = t;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                cur = next;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return head;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31

                                                                                                                                                                                                                                                                                                                    437. 路径总和 III

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个二叉树,它的每个结点都存放着一个整数值。

                                                                                                                                                                                                                                                                                                                    找出路径和等于给定数值的路径总数。

                                                                                                                                                                                                                                                                                                                    路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

                                                                                                                                                                                                                                                                                                                    二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
                                                                                                                                                                                                                                                                                                                          10
                                                                                                                                                                                                                                                                                                                         /  \
                                                                                                                                                                                                                                                                                                                        5   -3
                                                                                                                                                                                                                                                                                                                       / \    \
                                                                                                                                                                                                                                                                                                                      3   2   11
                                                                                                                                                                                                                                                                                                                     / \   \
                                                                                                                                                                                                                                                                                                                    3  -2   1
                                                                                                                                                                                                                                                                                                                    返回 3。和等于 8 的路径有:
                                                                                                                                                                                                                                                                                                                    1.  5 -> 3
                                                                                                                                                                                                                                                                                                                    2.  5 -> 2 -> 1
                                                                                                                                                                                                                                                                                                                    3.  -3 -> 11
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int pathSum(TreeNode root, int sum) {
                                                                                                                                                                                                                                                                                                                            // key是前缀和, value是大小为key的前缀和出现的次数
                                                                                                                                                                                                                                                                                                                            Map<Integer, Integer> prefixSumCount = new HashMap<>();
                                                                                                                                                                                                                                                                                                                            // 前缀和为0的一条路径
                                                                                                                                                                                                                                                                                                                            prefixSumCount.put(0, 1);
                                                                                                                                                                                                                                                                                                                            // 前缀和的递归回溯思路
                                                                                                                                                                                                                                                                                                                            return recursionPathSum(root, prefixSumCount, sum, 0);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                        /**
                                                                                                                                                                                                                                                                                                                         * 前缀和的递归回溯思路
                                                                                                                                                                                                                                                                                                                         * 从当前节点反推到根节点(反推比较好理解,正向其实也只有一条),有且仅有一条路径,因为这是一棵树
                                                                                                                                                                                                                                                                                                                         * 如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了
                                                                                                                                                                                                                                                                                                                         * 所以前缀和对于当前路径来说是唯一的,当前记录的前缀和,在回溯结束,回到本层时去除,保证其不影响其他分支的结果
                                                                                                                                                                                                                                                                                                                         * @param node 树节点
                                                                                                                                                                                                                                                                                                                         * @param prefixSumCount 前缀和Map
                                                                                                                                                                                                                                                                                                                         * @param target 目标值
                                                                                                                                                                                                                                                                                                                         * @param currSum 当前路径和
                                                                                                                                                                                                                                                                                                                         * @return 满足题意的解
                                                                                                                                                                                                                                                                                                                         */
                                                                                                                                                                                                                                                                                                                        private int recursionPathSum(TreeNode node, Map<Integer, Integer> prefixSumCount, int target, int currSum) {
                                                                                                                                                                                                                                                                                                                            // 1.递归终止条件
                                                                                                                                                                                                                                                                                                                            if (node == null) {
                                                                                                                                                                                                                                                                                                                                return 0;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            // 2.本层要做的事情
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            // 当前路径上的和
                                                                                                                                                                                                                                                                                                                            currSum += node.val;
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                            //---核心代码
                                                                                                                                                                                                                                                                                                                            // 看看root到当前节点这条路上是否存在节点前缀和加target为currSum的路径
                                                                                                                                                                                                                                                                                                                            // 当前节点->root节点反推,有且仅有一条路径,如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了
                                                                                                                                                                                                                                                                                                                            // currSum-target相当于找路径的起点,起点的sum+target=currSum,当前点到起点的距离就是target
                                                                                                                                                                                                                                                                                                                            res += prefixSumCount.getOrDefault(currSum - target, 0);
                                                                                                                                                                                                                                                                                                                            // 更新路径上当前节点前缀和的个数
                                                                                                                                                                                                                                                                                                                            prefixSumCount.put(currSum, prefixSumCount.getOrDefault(currSum, 0) + 1);
                                                                                                                                                                                                                                                                                                                            //---核心代码
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                            // 3.进入下一层
                                                                                                                                                                                                                                                                                                                            res += recursionPathSum(node.left, prefixSumCount, target, currSum);
                                                                                                                                                                                                                                                                                                                            res += recursionPathSum(node.right, prefixSumCount, target, currSum);
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                            // 4.回到本层,恢复状态,去除当前节点的前缀和数量
                                                                                                                                                                                                                                                                                                                            prefixSumCount.put(currSum, prefixSumCount.get(currSum) - 1);
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                                                                    • 45
                                                                                                                                                                                                                                                                                                                    • 46
                                                                                                                                                                                                                                                                                                                    • 47
                                                                                                                                                                                                                                                                                                                    • 48
                                                                                                                                                                                                                                                                                                                    • 49
                                                                                                                                                                                                                                                                                                                    • 50
                                                                                                                                                                                                                                                                                                                    • 51
                                                                                                                                                                                                                                                                                                                    • 52
                                                                                                                                                                                                                                                                                                                    • 53
                                                                                                                                                                                                                                                                                                                    • 54
                                                                                                                                                                                                                                                                                                                    • 55
                                                                                                                                                                                                                                                                                                                    • 56
                                                                                                                                                                                                                                                                                                                    • 57
                                                                                                                                                                                                                                                                                                                    • 58

                                                                                                                                                                                                                                                                                                                    441. 排列硬币

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    你总共有 枚硬币,你需要将它们摆成一个阶梯形状,第 行就必须正好有 枚硬币。

                                                                                                                                                                                                                                                                                                                    给定一个数字 n,找出可形成完整阶梯行的总行数。

                                                                                                                                                                                                                                                                                                                    是一个非负整数,并且在32位有符号整型的范围内。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    n = 5
                                                                                                                                                                                                                                                                                                                    硬币可排列成以下几行:
                                                                                                                                                                                                                                                                                                                    ¤
                                                                                                                                                                                                                                                                                                                    ¤ ¤
                                                                                                                                                                                                                                                                                                                    ¤ ¤
                                                                                                                                                                                                                                                                                                                    因为第三行不完整,所以返回2.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    n = 8
                                                                                                                                                                                                                                                                                                                    硬币可排列成以下几行:
                                                                                                                                                                                                                                                                                                                    ¤
                                                                                                                                                                                                                                                                                                                    ¤ ¤
                                                                                                                                                                                                                                                                                                                    ¤ ¤ ¤
                                                                                                                                                                                                                                                                                                                    ¤ ¤
                                                                                                                                                                                                                                                                                                                    因为第四行不完整,所以返回3.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    (1 + x) * x / 2 <= n,求解 x。
                                                                                                                                                                                                                                                                                                                    (x + 1/2)² <= 2n + 1/4,即 x <= sqrt(2n + 1/4) - 1/2
                                                                                                                                                                                                                                                                                                                    由于 2n 可能溢出,故转换为 x <= sqrt(2) * sqrt(n + 1/8) - 1/2

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int arrangeCoins(int n) {
                                                                                                                                                                                                                                                                                                                            return (int) (Math.sqrt(2) * Math.sqrt(n + 0.125) - 0.5);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5

                                                                                                                                                                                                                                                                                                                    442. 数组中重复的数据

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个整数数组 a,其中1 ≤ a[i] ≤ nn为数组长度), 其中有些元素出现两次而其他元素出现一次

                                                                                                                                                                                                                                                                                                                    找到所有出现两次的元素。

                                                                                                                                                                                                                                                                                                                    你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [4,3,2,7,8,2,3,1]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    [2,3]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public List<Integer> findDuplicates(int[] nums) {
                                                                                                                                                                                                                                                                                                                            List<Integer> ans = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            for(int i = 0; i < nums.length; i++) {
                                                                                                                                                                                                                                                                                                                                if(nums[i] != nums[nums[i] - 1]) {
                                                                                                                                                                                                                                                                                                                                    swap(nums, i, nums[i] - 1);
                                                                                                                                                                                                                                                                                                                                    i--;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            System.out.println(Arrays.toString(nums));
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            for(int i = 0; i < nums.length; i++) {
                                                                                                                                                                                                                                                                                                                                if(nums[i] != i + 1) {
                                                                                                                                                                                                                                                                                                                                    ans.add(nums[i]);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            return ans;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                        private void swap(int[] nums, int i, int j) {
                                                                                                                                                                                                                                                                                                                    		int tmp = nums[i];
                                                                                                                                                                                                                                                                                                                    		nums[i] = nums[j];
                                                                                                                                                                                                                                                                                                                    		nums[j] = tmp;
                                                                                                                                                                                                                                                                                                                    	}
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27

                                                                                                                                                                                                                                                                                                                    445. 两数相加 II

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    你可以假设除了数字 0 之外,这两个数字都不会以零开头。

                                                                                                                                                                                                                                                                                                                    进阶:

                                                                                                                                                                                                                                                                                                                    如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
                                                                                                                                                                                                                                                                                                                    输出: 7 -> 8 -> 0 -> 7
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
                                                                                                                                                                                                                                                                                                                            Deque<Integer> s1 = new ArrayDeque<>();
                                                                                                                                                                                                                                                                                                                            Deque<Integer> s2 = new ArrayDeque<>();
                                                                                                                                                                                                                                                                                                                            for (; l1 != null; l1 = l1.next) {
                                                                                                                                                                                                                                                                                                                                s1.push(l1.val);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (; l2 != null; l2 = l2.next) {
                                                                                                                                                                                                                                                                                                                                s2.push(l2.val);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            ListNode head = null;
                                                                                                                                                                                                                                                                                                                            int carry = 0;
                                                                                                                                                                                                                                                                                                                            while (!s1.isEmpty() || !s2.isEmpty() || carry > 0) {
                                                                                                                                                                                                                                                                                                                                carry += (s1.isEmpty() ? 0 : s1.pop()) + (s2.isEmpty() ? 0 : s2.pop());
                                                                                                                                                                                                                                                                                                                                ListNode h = new ListNode(carry % 10);
                                                                                                                                                                                                                                                                                                                                h.next = head;
                                                                                                                                                                                                                                                                                                                                head = h;
                                                                                                                                                                                                                                                                                                                                carry /= 10;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return head;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22

                                                                                                                                                                                                                                                                                                                    448. 找到所有数组中消失的数字

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个范围在  1 ≤ a[i] ≤ nn = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

                                                                                                                                                                                                                                                                                                                    找到所有在 [1, n] 范围之间没有出现在数组中的数字。

                                                                                                                                                                                                                                                                                                                    您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [4,3,2,7,8,2,3,1]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    [5,6]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    • 遍历输入数组的每个元素一次。
                                                                                                                                                                                                                                                                                                                    • |nums[i]|-1 索引位置的元素标记为负数。即 nums[|nums[i]|-1] * -1。
                                                                                                                                                                                                                                                                                                                    • 然后遍历数组,若当前数组元素 nums[i] 为负数,说明我们在数组中存在数字 i+1。否则,说明数组不存在数字 i+1,添加到结果列表中。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public List<Integer> findDisappearedNumbers(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                int index = Math.abs(nums[i]) - 1;
                                                                                                                                                                                                                                                                                                                                if (nums[index] > 0) {
                                                                                                                                                                                                                                                                                                                                    nums[index] *= -1;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            List<Integer> res = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                if (nums[i] > 0) {
                                                                                                                                                                                                                                                                                                                                    res.add(i + 1);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18

                                                                                                                                                                                                                                                                                                                    449. 序列化和反序列化二叉搜索树

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

                                                                                                                                                                                                                                                                                                                    设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

                                                                                                                                                                                                                                                                                                                    编码的字符串应尽可能紧凑。

                                                                                                                                                                                                                                                                                                                    注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    public class Codec {
                                                                                                                                                                                                                                                                                                                            // Encodes a tree to a single string.
                                                                                                                                                                                                                                                                                                                            public String serialize(TreeNode root) {
                                                                                                                                                                                                                                                                                                                                if (root == null) {
                                                                                                                                                                                                                                                                                                                                    return "";
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                                                                                                                                                robot(root, sb);
                                                                                                                                                                                                                                                                                                                                return sb.substring(0, sb.length() - 1);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            private void robot(TreeNode root, StringBuilder sb) {
                                                                                                                                                                                                                                                                                                                                if (root == null) {
                                                                                                                                                                                                                                                                                                                                    return;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                sb.append(root.val).append(",");
                                                                                                                                                                                                                                                                                                                                robot(root.left, sb);
                                                                                                                                                                                                                                                                                                                                robot(root.right, sb);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            // Decodes your encoded data to tree.
                                                                                                                                                                                                                                                                                                                            public TreeNode deserialize(String data) {
                                                                                                                                                                                                                                                                                                                                if (data == null || Objects.equals(data, "")) {
                                                                                                                                                                                                                                                                                                                                    return null;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                String[] pre = data.split(",");
                                                                                                                                                                                                                                                                                                                                return build(pre, 0, pre.length - 1);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            private TreeNode build(String[] pre, int start, int end) {
                                                                                                                                                                                                                                                                                                                                if (start > end) {
                                                                                                                                                                                                                                                                                                                                    return null;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                TreeNode root = new TreeNode(Integer.valueOf(pre[start]));
                                                                                                                                                                                                                                                                                                                                int index = end + 1;
                                                                                                                                                                                                                                                                                                                                for (int i = start + 1; i <= end; i++) {
                                                                                                                                                                                                                                                                                                                                    if (Integer.valueOf(pre[i]) > root.val) {
                                                                                                                                                                                                                                                                                                                                        index = i;
                                                                                                                                                                                                                                                                                                                                        break;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                root.left = build(pre, start + 1, index - 1);
                                                                                                                                                                                                                                                                                                                                root.right = build(pre, index, end);
                                                                                                                                                                                                                                                                                                                                return root;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    // Your Codec object will be instantiated and called as such:
                                                                                                                                                                                                                                                                                                                    // Codec codec = new Codec();
                                                                                                                                                                                                                                                                                                                    // codec.deserialize(codec.serialize(root));
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43
                                                                                                                                                                                                                                                                                                                    • 44
                                                                                                                                                                                                                                                                                                                    • 45
                                                                                                                                                                                                                                                                                                                    • 46
                                                                                                                                                                                                                                                                                                                    • 47
                                                                                                                                                                                                                                                                                                                    • 48
                                                                                                                                                                                                                                                                                                                    • 49
                                                                                                                                                                                                                                                                                                                    • 50
                                                                                                                                                                                                                                                                                                                    • 51
                                                                                                                                                                                                                                                                                                                    • 52
                                                                                                                                                                                                                                                                                                                    • 53
                                                                                                                                                                                                                                                                                                                    • 54
                                                                                                                                                                                                                                                                                                                    • 55

                                                                                                                                                                                                                                                                                                                    450. 删除二叉搜索树中的节点

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

                                                                                                                                                                                                                                                                                                                    一般来说,删除节点可分为两个步骤:

                                                                                                                                                                                                                                                                                                                    1. 首先找到需要删除的节点;
                                                                                                                                                                                                                                                                                                                    2. 如果找到了,删除它。

                                                                                                                                                                                                                                                                                                                    说明: 要求算法时间复杂度为 O(h),h 为树的高度。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    root = [5,3,6,2,4,null,7]
                                                                                                                                                                                                                                                                                                                    key = 3
                                                                                                                                                                                                                                                                                                                        5
                                                                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                                                                      3   6
                                                                                                                                                                                                                                                                                                                     / \   \
                                                                                                                                                                                                                                                                                                                    2   4   7
                                                                                                                                                                                                                                                                                                                    给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
                                                                                                                                                                                                                                                                                                                    一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
                                                                                                                                                                                                                                                                                                                        5
                                                                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                                                                      4   6
                                                                                                                                                                                                                                                                                                                     /     \
                                                                                                                                                                                                                                                                                                                    2       7
                                                                                                                                                                                                                                                                                                                    另一个正确答案是 [5,2,6,null,4,null,7]。
                                                                                                                                                                                                                                                                                                                        5
                                                                                                                                                                                                                                                                                                                       / \
                                                                                                                                                                                                                                                                                                                      2   6
                                                                                                                                                                                                                                                                                                                       \   \
                                                                                                                                                                                                                                                                                                                        4   7
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public TreeNode deleteNode(TreeNode root, int key) {
                                                                                                                                                                                                                                                                                                                            if (root == null) {
                                                                                                                                                                                                                                                                                                                                return null;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (root.val > key) {
                                                                                                                                                                                                                                                                                                                                root.left = deleteNode(root.left, key);
                                                                                                                                                                                                                                                                                                                                return root;
                                                                                                                                                                                                                                                                                                                            } else if (root.val < key) {
                                                                                                                                                                                                                                                                                                                                root.right = deleteNode(root.right, key);
                                                                                                                                                                                                                                                                                                                                return root;
                                                                                                                                                                                                                                                                                                                            } else {
                                                                                                                                                                                                                                                                                                                                if (root.left == null) return root.right;
                                                                                                                                                                                                                                                                                                                                if (root.right == null) return root.left;
                                                                                                                                                                                                                                                                                                                                TreeNode newRoot = root.right;
                                                                                                                                                                                                                                                                                                                                TreeNode parent = null;
                                                                                                                                                                                                                                                                                                                                while (newRoot.left != null) {
                                                                                                                                                                                                                                                                                                                                    parent = newRoot;
                                                                                                                                                                                                                                                                                                                                    newRoot = newRoot.left;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                if (parent != null) {
                                                                                                                                                                                                                                                                                                                                    parent.left = newRoot.right;
                                                                                                                                                                                                                                                                                                                                    newRoot.right = root.right;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                newRoot.left = root.left;
                                                                                                                                                                                                                                                                                                                                return newRoot;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29

                                                                                                                                                                                                                                                                                                                    452. 用最少数量的箭引爆气球

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。

                                                                                                                                                                                                                                                                                                                    一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被引爆可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。

                                                                                                                                                                                                                                                                                                                    Example:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [[10,16], [2,8], [1,6], [7,12]]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    2
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    对于该样例,我们可以在x = 6(射爆[2,8],[1,6]两个气球)和 x = 11(射爆另外两个气球)。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findMinArrowShots(int[][] points) {
                                                                                                                                                                                                                                                                                                                            if (points == null || points.length == 0) {
                                                                                                                                                                                                                                                                                                                                return 0;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            Arrays.sort(points, Comparator.comparingInt(o -> o[1]));
                                                                                                                                                                                                                                                                                                                            int res = 1;
                                                                                                                                                                                                                                                                                                                            int pre = points[0][1];
                                                                                                                                                                                                                                                                                                                            for (int i = 1; i < points.length; ++i) {
                                                                                                                                                                                                                                                                                                                                if (points[i][0] > pre) {
                                                                                                                                                                                                                                                                                                                                    ++res;
                                                                                                                                                                                                                                                                                                                                    pre = points[i][1];
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17

                                                                                                                                                                                                                                                                                                                    453. 最小移动次数使数组元素相等

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个长度为 n非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [1,2,3]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    3
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    只需要3次移动(注意每次移动会增加两个元素的值):
                                                                                                                                                                                                                                                                                                                    [1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int minMoves(int[] nums) {
                                                                                                                                                                                                                                                                                                                            return Arrays.stream(nums).sum() - Arrays.stream(nums).min().getAsInt() * nums.length;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5

                                                                                                                                                                                                                                                                                                                    454. 四数相加 II

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0

                                                                                                                                                                                                                                                                                                                    为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。

                                                                                                                                                                                                                                                                                                                    例如:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    A = [ 1, 2]
                                                                                                                                                                                                                                                                                                                    B = [-2,-1]
                                                                                                                                                                                                                                                                                                                    C = [-1, 2]
                                                                                                                                                                                                                                                                                                                    D = [ 0, 2]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    2
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    两个元组如下:
                                                                                                                                                                                                                                                                                                                    1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
                                                                                                                                                                                                                                                                                                                    2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
                                                                                                                                                                                                                                                                                                                            Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                            for (int a : A) {
                                                                                                                                                                                                                                                                                                                                for (int b : B) {
                                                                                                                                                                                                                                                                                                                                    int key = a + b;
                                                                                                                                                                                                                                                                                                                                    map.put(key, map.getOrDefault(key, 0) + 1);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int c : C) {
                                                                                                                                                                                                                                                                                                                                for (int d : D) {
                                                                                                                                                                                                                                                                                                                                    res += map.getOrDefault(-(c + d), 0);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18

                                                                                                                                                                                                                                                                                                                    456. 132 模式

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。

                                                                                                                                                                                                                                                                                                                    注意:n 的值小于15000。

                                                                                                                                                                                                                                                                                                                    示例1:

                                                                                                                                                                                                                                                                                                                    输入: [1, 2, 3, 4]
                                                                                                                                                                                                                                                                                                                    输出: False
                                                                                                                                                                                                                                                                                                                    解释: 序列中不存在132模式的子序列。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [3, 1, 4, 2]
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 序列中有 1 个132模式的子序列: [1, 4, 2].
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入: [-1, 3, 2, 0]
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 序列中有 3 个132模式的的子序列: [-1, 3, 2], [-1, 3, 0] 和 [-1, 2, 0].
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean find132pattern(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int ak = Integer.MIN_VALUE;
                                                                                                                                                                                                                                                                                                                            Deque<Integer> stack = new ArrayDeque<>();
                                                                                                                                                                                                                                                                                                                            for (int i = nums.length - 1; i >= 0; --i) {
                                                                                                                                                                                                                                                                                                                                if (nums[i] < ak) {
                                                                                                                                                                                                                                                                                                                                    return true;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                while (!stack.isEmpty() && nums[i] > stack.peek()) {
                                                                                                                                                                                                                                                                                                                                    ak = stack.pop();
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                stack.push(nums[i]);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return false;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    458. 可怜的小猪

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    有 1000 只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在 15 分钟内死去。

                                                                                                                                                                                                                                                                                                                    问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?

                                                                                                                                                                                                                                                                                                                    回答这个问题,并为下列的进阶问题编写一个通用算法。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    进阶:

                                                                                                                                                                                                                                                                                                                    假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出 “有毒” 水桶?这 n 只水桶里有且仅有一只有毒的桶。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    1. 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
                                                                                                                                                                                                                                                                                                                    2. 小猪喝完水后,必须有 m 分钟的冷却时间。在这段时间里,只允许观察,而不允许继续饮水。
                                                                                                                                                                                                                                                                                                                    3. 任何给定的桶都可以无限次采样(无限数量的猪)。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
                                                                                                                                                                                                                                                                                                                            int base = minutesToTest / minutesToDie + 1;
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            int p = 1;
                                                                                                                                                                                                                                                                                                                            while (p < buckets) {
                                                                                                                                                                                                                                                                                                                                p *= base;
                                                                                                                                                                                                                                                                                                                                ++res;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12

                                                                                                                                                                                                                                                                                                                    459. 重复的子字符串

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: "abab"
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 可由子字符串 "ab" 重复两次构成。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: "aba"
                                                                                                                                                                                                                                                                                                                    输出: False
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入: "abcabcabcabc"
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean repeatedSubstringPattern(String s) {
                                                                                                                                                                                                                                                                                                                            String str = s + s;
                                                                                                                                                                                                                                                                                                                            return str.substring(1, str.length() - 1).contains(s);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6

                                                                                                                                                                                                                                                                                                                    461. 汉明距离

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

                                                                                                                                                                                                                                                                                                                    给出两个整数 xy,计算它们之间的汉明距离。

                                                                                                                                                                                                                                                                                                                    注意:
                                                                                                                                                                                                                                                                                                                    0 ≤ x, y < 231.

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: x = 1, y = 4
                                                                                                                                                                                                                                                                                                                    输出: 2
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    1   (0 0 0 1)
                                                                                                                                                                                                                                                                                                                    4   (0 1 0 0)
                                                                                                                                                                                                                                                                                                                           ↑   ↑
                                                                                                                                                                                                                                                                                                                    上面的箭头指出了对应二进制位不同的位置。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int hammingDistance(int x, int y) {
                                                                                                                                                                                                                                                                                                                            int count = 0, sum = x ^ y;
                                                                                                                                                                                                                                                                                                                            while (sum != 0) {
                                                                                                                                                                                                                                                                                                                                sum &= (sum - 1);
                                                                                                                                                                                                                                                                                                                                count++;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return count;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10

                                                                                                                                                                                                                                                                                                                    462. 最少移动次数使数组元素相等 II

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。

                                                                                                                                                                                                                                                                                                                    例如:

                                                                                                                                                                                                                                                                                                                    输入:
                                                                                                                                                                                                                                                                                                                    [1,2,3]
                                                                                                                                                                                                                                                                                                                    输出:
                                                                                                                                                                                                                                                                                                                    2
                                                                                                                                                                                                                                                                                                                    说明:
                                                                                                                                                                                                                                                                                                                    只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): 
                                                                                                                                                                                                                                                                                                                    [1,2,3]  =>  [2,2,3]  =>  [2,2,2]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int minMoves2(int[] nums) {
                                                                                                                                                                                                                                                                                                                            Arrays.sort(nums);
                                                                                                                                                                                                                                                                                                                            int k = nums[nums.length / 2];
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int num : nums) {
                                                                                                                                                                                                                                                                                                                                res += Math.abs(num - k);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11

                                                                                                                                                                                                                                                                                                                    473. 火柴拼正方形

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。

                                                                                                                                                                                                                                                                                                                    输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1,1,2,2,2]
                                                                                                                                                                                                                                                                                                                    输出: true
                                                                                                                                                                                                                                                                                                                    解释: 能拼成一个边长为2的正方形,每边两根火柴。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [3,3,3,3,4]
                                                                                                                                                                                                                                                                                                                    输出: false
                                                                                                                                                                                                                                                                                                                    解释: 不能用所有火柴拼成一个正方形。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 给定的火柴长度和在 0 到 10^9之间。
                                                                                                                                                                                                                                                                                                                    2. 火柴数组的长度不超过15。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean makesquare(int[] nums) {
                                                                                                                                                                                                                                                                                                                            if (nums == null || nums.length == 0) {
                                                                                                                                                                                                                                                                                                                                return false;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int sum = Arrays.stream(nums).sum();
                                                                                                                                                                                                                                                                                                                            if (sum % 4 != 0) {
                                                                                                                                                                                                                                                                                                                                return false;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            Arrays.sort(nums);
                                                                                                                                                                                                                                                                                                                            int[] lens = new int[4];
                                                                                                                                                                                                                                                                                                                            return dfs(nums, nums.length - 1, lens, sum / 4);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private boolean dfs(int[] nums, int index, int[] lens, int len) {
                                                                                                                                                                                                                                                                                                                            if (lens[0] == len && lens[1] == len && lens[2] == len) {
                                                                                                                                                                                                                                                                                                                                return true;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < 4; ++i) {
                                                                                                                                                                                                                                                                                                                                if (lens[i] + nums[index] <= len) {
                                                                                                                                                                                                                                                                                                                                    lens[i] += nums[index];
                                                                                                                                                                                                                                                                                                                                    if (dfs(nums, index - 1, lens, len)) {
                                                                                                                                                                                                                                                                                                                                        return true;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                    lens[i] -= nums[index];
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return false;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29

                                                                                                                                                                                                                                                                                                                    475. 供暖器

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

                                                                                                                                                                                                                                                                                                                    现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。

                                                                                                                                                                                                                                                                                                                    所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。

                                                                                                                                                                                                                                                                                                                    说明:

                                                                                                                                                                                                                                                                                                                    1. 给出的房屋和供暖器的数目是非负数且不会超过 25000。
                                                                                                                                                                                                                                                                                                                    2. 给出的房屋和供暖器的位置均是非负数且不会超过10^9。
                                                                                                                                                                                                                                                                                                                    3. 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。
                                                                                                                                                                                                                                                                                                                    4. 所有供暖器都遵循你的半径标准,加热的半径也一样。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1,2,3],[2]
                                                                                                                                                                                                                                                                                                                    输出: 1
                                                                                                                                                                                                                                                                                                                    解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [1,2,3,4],[1,4]
                                                                                                                                                                                                                                                                                                                    输出: 1
                                                                                                                                                                                                                                                                                                                    解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findRadius(int[] houses, int[] heaters) {
                                                                                                                                                                                                                                                                                                                            Arrays.sort(heaters);
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int x : houses) {
                                                                                                                                                                                                                                                                                                                                int i = Arrays.binarySearch(heaters, x);
                                                                                                                                                                                                                                                                                                                                if (i < 0) {
                                                                                                                                                                                                                                                                                                                                    i = ~i;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                int dis1 = i > 0 ? x - heaters[i - 1] : Integer.MAX_VALUE;
                                                                                                                                                                                                                                                                                                                                int dis2 = i < heaters.length ? heaters[i] - x : Integer.MAX_VALUE;
                                                                                                                                                                                                                                                                                                                                res = Math.max(res, Math.min(dis1, dis2));
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    477. 汉明距离总和

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

                                                                                                                                                                                                                                                                                                                    计算一个数组中,任意两个数之间汉明距离的总和。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: 4, 14, 2
                                                                                                                                                                                                                                                                                                                    输出: 6
                                                                                                                                                                                                                                                                                                                    解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)
                                                                                                                                                                                                                                                                                                                    所以答案为:
                                                                                                                                                                                                                                                                                                                    HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 数组中元素的范围为从 0到 10^9
                                                                                                                                                                                                                                                                                                                    2. 数组的长度不超过 10^4

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int totalHammingDistance(int[] nums) {
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            if (nums == null || nums.length < 2) {
                                                                                                                                                                                                                                                                                                                    			return 0;
                                                                                                                                                                                                                                                                                                                    		}
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            int[] m = new int[31];// 存储对应位数,有多少个0
                                                                                                                                                                                                                                                                                                                            for(int num : nums) {
                                                                                                                                                                                                                                                                                                                            	for(int i = 0; i < 31; i++) {
                                                                                                                                                                                                                                                                                                                            		if ((num & (1 << i)) == 0) {
                                                                                                                                                                                                                                                                                                                    					m[i]++;
                                                                                                                                                                                                                                                                                                                    				}
                                                                                                                                                                                                                                                                                                                            	}
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            int result = 0;
                                                                                                                                                                                                                                                                                                                            for(int i = 0; i < 31; i++) {
                                                                                                                                                                                                                                                                                                                            	result += m[i] * (nums.length - m[i]);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                            return result;
                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25

                                                                                                                                                                                                                                                                                                                    483. 最小好进制

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制

                                                                                                                                                                                                                                                                                                                    以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:"13"
                                                                                                                                                                                                                                                                                                                    输出:"3"
                                                                                                                                                                                                                                                                                                                    解释:13 的 3 进制是 111。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:"4681"
                                                                                                                                                                                                                                                                                                                    输出:"8"
                                                                                                                                                                                                                                                                                                                    解释:4681 的 8 进制是 11111。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入:"1000000000000000000"
                                                                                                                                                                                                                                                                                                                    输出:"999999999999999999"
                                                                                                                                                                                                                                                                                                                    解释:1000000000000000000 的 999999999999999999 进制是 11。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    1. n的取值范围是 [3, 10^18]。
                                                                                                                                                                                                                                                                                                                    2. 输入总是有效且没有前导 0。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String smallestGoodBase(String n) {
                                                                                                                                                                                                                                                                                                                            long num = Long.parseLong(n);
                                                                                                                                                                                                                                                                                                                            for (int len = 63; len >= 2; --len) {
                                                                                                                                                                                                                                                                                                                                long radix = getRadix(len, num);
                                                                                                                                                                                                                                                                                                                                if (radix != -1) {
                                                                                                                                                                                                                                                                                                                                    return String.valueOf(radix);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return String.valueOf(num - 1);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private long getRadix(int len, long num) {
                                                                                                                                                                                                                                                                                                                            long l = 2, r = num - 1;
                                                                                                                                                                                                                                                                                                                            while (l < r) {
                                                                                                                                                                                                                                                                                                                                long mid = l + r >>> 1;
                                                                                                                                                                                                                                                                                                                                if (calc(mid, len) >= num) r = mid;
                                                                                                                                                                                                                                                                                                                                else l = mid + 1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return calc(r, len) == num ? r : -1;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private long calc(long radix, int len) {
                                                                                                                                                                                                                                                                                                                            long p = 1;
                                                                                                                                                                                                                                                                                                                            long sum = 0;
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < len; ++i) {
                                                                                                                                                                                                                                                                                                                                if (Long.MAX_VALUE - sum < p) {
                                                                                                                                                                                                                                                                                                                                    return Long.MAX_VALUE;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                sum += p;
                                                                                                                                                                                                                                                                                                                                if (Long.MAX_VALUE / p < radix) {
                                                                                                                                                                                                                                                                                                                                    p = Long.MAX_VALUE;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    p *= radix;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return sum;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37

                                                                                                                                                                                                                                                                                                                    485. 最大连续 1 的个数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个二进制数组, 计算其中最大连续1的个数。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1,1,0,1,1,1]
                                                                                                                                                                                                                                                                                                                    输出: 3
                                                                                                                                                                                                                                                                                                                    解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    • 输入的数组只包含 01
                                                                                                                                                                                                                                                                                                                    • 输入数组的长度是正整数,且不超过 10,000。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findMaxConsecutiveOnes(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int res = 0, t = 0;
                                                                                                                                                                                                                                                                                                                            for (int num : nums) {
                                                                                                                                                                                                                                                                                                                                if (num == 1) {
                                                                                                                                                                                                                                                                                                                                    ++t;
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    res = Math.max(res, t);
                                                                                                                                                                                                                                                                                                                                    t = 0;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return Math.max(res, t);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14

                                                                                                                                                                                                                                                                                                                    486. 预测赢家

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。

                                                                                                                                                                                                                                                                                                                    给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1, 5, 2]
                                                                                                                                                                                                                                                                                                                    输出: False
                                                                                                                                                                                                                                                                                                                    解释: 一开始,玩家1可以从1和2中进行选择。
                                                                                                                                                                                                                                                                                                                    如果他选择2(或者1),那么玩家2可以从1(或者2)和5中进行选择。如果玩家2选择了5,那么玩家1则只剩下1(或者2)可选。
                                                                                                                                                                                                                                                                                                                    所以,玩家1的最终分数为 1 + 2 = 3,而玩家2为 5。
                                                                                                                                                                                                                                                                                                                    因此,玩家1永远不会成为赢家,返回 False。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: [1, 5, 233, 7]
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 玩家1一开始选择1。然后玩家2必须从5和7中进行选择。无论玩家2选择了哪个,玩家1都可以选择233。
                                                                                                                                                                                                                                                                                                                    最终,玩家1(234分)比玩家2(12分)获得更多的分数,所以返回 True,表示玩家1可以成为赢家。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 1 <= 给定的数组长度 <= 20.
                                                                                                                                                                                                                                                                                                                    2. 数组里所有分数都为非负数且不会大于10000000。
                                                                                                                                                                                                                                                                                                                    3. 如果最终两个玩家的分数相等,那么玩家1仍为赢家。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean PredictTheWinner(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            if ((n & 1) == 0) {
                                                                                                                                                                                                                                                                                                                                return true;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int[] f = new int[n];
                                                                                                                                                                                                                                                                                                                            for (int i = n - 1; i >= 0; --i) {
                                                                                                                                                                                                                                                                                                                                f[i] = nums[i];
                                                                                                                                                                                                                                                                                                                                for (int j = i + 1; j < n; ++j) {
                                                                                                                                                                                                                                                                                                                                    f[j] = Math.max(nums[i] - f[j], nums[j] - f[j - 1]);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return f[n - 1] >= 0;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    487. 最大连续 1 的个数 II

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:[1,0,1,1,0]
                                                                                                                                                                                                                                                                                                                    输出:4
                                                                                                                                                                                                                                                                                                                    解释:翻转第一个 0 可以得到最长的连续 1。
                                                                                                                                                                                                                                                                                                                         当翻转以后,最大连续 1 的个数为 4。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注:

                                                                                                                                                                                                                                                                                                                    • 输入数组只包含 01.
                                                                                                                                                                                                                                                                                                                    • 输入数组的长度为正整数,且不超过 10,000

                                                                                                                                                                                                                                                                                                                    进阶:
                                                                                                                                                                                                                                                                                                                    如果输入的数字是作为 无限流 逐个输入如何处理?换句话说,内存不能存储下所有从流中输入的数字。您可以有效地解决吗?

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    prefix[i] 数组表示以 i 结尾往前累计的最大连续 1 的个数,suffix[i] 数组表示以 i 开头往后累计的最大连续 1 的个数。
                                                                                                                                                                                                                                                                                                                    遍历 nums 数组每个为 0 的位置,则位置 i 的最大连续 1 的个数为 1 + prefix[i-1] + suffix[i+1]
                                                                                                                                                                                                                                                                                                                    当然,如果 nums 数组没有 0,即所有元素都是 1,那么结果即为 nums 数组的长度。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    • 双指针,时间复杂度 O(n²),空间复杂度 O(1)
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findMaxConsecutiveOnes(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                int cnt = 1;
                                                                                                                                                                                                                                                                                                                                int j = i;
                                                                                                                                                                                                                                                                                                                                while (j < n && (cnt > 0 || nums[j] == 1)) {
                                                                                                                                                                                                                                                                                                                                    if (nums[j] == 0) --cnt;
                                                                                                                                                                                                                                                                                                                                    ++j;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                res = Math.max(res, j - i);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 辅助数组,时间复杂度 O(n),空间复杂度 O(n)
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findMaxConsecutiveOnes(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            int[] prefix = new int[n];
                                                                                                                                                                                                                                                                                                                            int[] suffix = new int[n];
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                if (i == 0) prefix[0] = nums[0];
                                                                                                                                                                                                                                                                                                                                else prefix[i] = nums[i] == 0 ? 0 : prefix[i - 1] + 1;
                                                                                                                                                                                                                                                                                                                                res = Math.max(res, prefix[i]);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (int i = n - 1; i >= 0; --i) {
                                                                                                                                                                                                                                                                                                                                if (i == n - 1) suffix[n - 1] = nums[n - 1];
                                                                                                                                                                                                                                                                                                                                else suffix[i] = nums[i] == 0 ? 0 : suffix[i + 1] + 1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                if (nums[i] == 0) {
                                                                                                                                                                                                                                                                                                                                    int t = 1;
                                                                                                                                                                                                                                                                                                                                    if (i > 0) t += prefix[i - 1];
                                                                                                                                                                                                                                                                                                                                    if (i < n - 1) t += suffix[i + 1];
                                                                                                                                                                                                                                                                                                                                    res = Math.max(res, t);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26

                                                                                                                                                                                                                                                                                                                    490. 迷宫

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    由空地和墙组成的迷宫中有一个。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。

                                                                                                                                                                                                                                                                                                                    给定球的起始位置,目的地迷宫,判断球能否在目的地停下。

                                                                                                                                                                                                                                                                                                                    迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入 1: 迷宫由以下二维数组表示
                                                                                                                                                                                                                                                                                                                    0 0 1 0 0
                                                                                                                                                                                                                                                                                                                    0 0 0 0 0
                                                                                                                                                                                                                                                                                                                    0 0 0 1 0
                                                                                                                                                                                                                                                                                                                    1 1 0 1 1
                                                                                                                                                                                                                                                                                                                    0 0 0 0 0
                                                                                                                                                                                                                                                                                                                    输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
                                                                                                                                                                                                                                                                                                                    输入 3: 目的地坐标 (rowDest, colDest) = (4, 4)
                                                                                                                                                                                                                                                                                                                    输出: true
                                                                                                                                                                                                                                                                                                                    解析: 一个可能的路径是 : 左 -> 下 -> 左 -> 下 -> 右 -> 下 -> 右。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入 1: 迷宫由以下二维数组表示
                                                                                                                                                                                                                                                                                                                    0 0 1 0 0
                                                                                                                                                                                                                                                                                                                    0 0 0 0 0
                                                                                                                                                                                                                                                                                                                    0 0 0 1 0
                                                                                                                                                                                                                                                                                                                    1 1 0 1 1
                                                                                                                                                                                                                                                                                                                    0 0 0 0 0
                                                                                                                                                                                                                                                                                                                    输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
                                                                                                                                                                                                                                                                                                                    输入 3: 目的地坐标 (rowDest, colDest) = (3, 2)
                                                                                                                                                                                                                                                                                                                    输出: false
                                                                                                                                                                                                                                                                                                                    解析: 没有能够使球停在目的地的路径。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 迷宫中只有一个球和一个目的地。
                                                                                                                                                                                                                                                                                                                    2. 球和目的地都在空地上,且初始时它们不在同一位置。
                                                                                                                                                                                                                                                                                                                    3. 给定的迷宫不包括边界 (如图中的红色矩形), 但你可以假设迷宫的边缘都是墙壁。
                                                                                                                                                                                                                                                                                                                    4. 迷宫至少包括2块空地,行数和列数均不超过100。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    深度优先搜索或广度优先搜索实现。

                                                                                                                                                                                                                                                                                                                    深度优先搜索。

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        private boolean[][] visited;
                                                                                                                                                                                                                                                                                                                        public boolean hasPath(int[][] maze, int[] start, int[] destination) {
                                                                                                                                                                                                                                                                                                                            int m = maze.length, n = maze[0].length;
                                                                                                                                                                                                                                                                                                                            visited = new boolean[m][n];
                                                                                                                                                                                                                                                                                                                            return dfs(maze, start, destination);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private boolean dfs(int[][] maze, int[] start, int[] destination) {
                                                                                                                                                                                                                                                                                                                            if (visited[start[0]][start[1]]) return false;
                                                                                                                                                                                                                                                                                                                            if (start[0] == destination[0] && start[1] == destination[1]) return true;
                                                                                                                                                                                                                                                                                                                            visited[start[0]][start[1]] = true;
                                                                                                                                                                                                                                                                                                                            int l = start[1] - 1, r = start[1] + 1, u = start[0] - 1, d = start[0] + 1;
                                                                                                                                                                                                                                                                                                                            while (l >= 0 && maze[start[0]][l] == 0) --l;
                                                                                                                                                                                                                                                                                                                            if (dfs(maze, new int[]{start[0], l + 1}, destination)) return true;
                                                                                                                                                                                                                                                                                                                            while (r < maze[0].length && maze[start[0]][r] == 0) ++r;
                                                                                                                                                                                                                                                                                                                            if (dfs(maze, new int[]{start[0], r - 1}, destination)) return true;
                                                                                                                                                                                                                                                                                                                            while (u >= 0 && maze[u][start[1]] == 0) --u;
                                                                                                                                                                                                                                                                                                                            if (dfs(maze, new int[]{u + 1, start[1]}, destination)) return true;
                                                                                                                                                                                                                                                                                                                            while (d < maze.length && maze[d][start[1]] == 0) ++d;
                                                                                                                                                                                                                                                                                                                            if (dfs(maze, new int[]{d - 1, start[1]}, destination)) return true;
                                                                                                                                                                                                                                                                                                                            return false;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23

                                                                                                                                                                                                                                                                                                                    492. 构造矩形

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:

                                                                                                                                                                                                                                                                                                                    1. 你设计的矩形页面必须等于给定的目标面积。
                                                                                                                                                                                                                                                                                                                    2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。
                                                                                                                                                                                                                                                                                                                    3. 长度 L 和宽度 W 之间的差距应当尽可能小。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    你需要按顺序输出你设计的页面的长度 L 和宽度 W。

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: 4
                                                                                                                                                                                                                                                                                                                    输出: [2, 2]
                                                                                                                                                                                                                                                                                                                    解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
                                                                                                                                                                                                                                                                                                                    但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    说明:

                                                                                                                                                                                                                                                                                                                    1. 给定的面积不大于 10,000,000 且为正整数。
                                                                                                                                                                                                                                                                                                                    2. 你设计的页面的长度和宽度必须都是正整数。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int[] constructRectangle(int area) {
                                                                                                                                                                                                                                                                                                                            int sr = (int) Math.sqrt(area);
                                                                                                                                                                                                                                                                                                                            int l = sr, w = sr;
                                                                                                                                                                                                                                                                                                                            while (l <= area && w >= 1) {
                                                                                                                                                                                                                                                                                                                                int s = l * w;
                                                                                                                                                                                                                                                                                                                                if (s == area) break;
                                                                                                                                                                                                                                                                                                                                if (s > area) --w;
                                                                                                                                                                                                                                                                                                                                else ++l;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return new int[]{l, w};
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13

                                                                                                                                                                                                                                                                                                                    494. 目标和

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

                                                                                                                                                                                                                                                                                                                    返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: nums: [1, 1, 1, 1, 1], S: 3
                                                                                                                                                                                                                                                                                                                    输出: 5
                                                                                                                                                                                                                                                                                                                    解释: 
                                                                                                                                                                                                                                                                                                                    -1+1+1+1+1 = 3
                                                                                                                                                                                                                                                                                                                    +1-1+1+1+1 = 3
                                                                                                                                                                                                                                                                                                                    +1+1-1+1+1 = 3
                                                                                                                                                                                                                                                                                                                    +1+1+1-1+1 = 3
                                                                                                                                                                                                                                                                                                                    +1+1+1+1-1 = 3
                                                                                                                                                                                                                                                                                                                    一共有5种方法让最终目标和为3。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 数组非空,且长度不会超过20。
                                                                                                                                                                                                                                                                                                                    2. 初始的数组的和不会超过1000。
                                                                                                                                                                                                                                                                                                                    3. 保证返回的最终结果能被32位整数存下。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int findTargetSumWays(int[] nums, int S) {
                                                                                                                                                                                                                                                                                                                            int[] ans = new int[1];
                                                                                                                                                                                                                                                                                                                            wayDfs(nums, 0, S, ans);
                                                                                                                                                                                                                                                                                                                            return ans[0];
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private void wayDfs(int[] nums, int start, int left, int[] ans) {
                                                                                                                                                                                                                                                                                                                            if (start == nums.length) {
                                                                                                                                                                                                                                                                                                                                if (left == 0) ans[0]++;
                                                                                                                                                                                                                                                                                                                                return;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            wayDfs(nums, start + 1, left + nums[start], ans);
                                                                                                                                                                                                                                                                                                                            wayDfs(nums, start + 1, left - nums[start], ans);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15

                                                                                                                                                                                                                                                                                                                    496. 下一个更大元素 I

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

                                                                                                                                                                                                                                                                                                                    nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 大的元素。如果不存在,对应位置输出-1。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
                                                                                                                                                                                                                                                                                                                    输出: [-1,3,-1]
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                        对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
                                                                                                                                                                                                                                                                                                                        对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
                                                                                                                                                                                                                                                                                                                        对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: nums1 = [2,4], nums2 = [1,2,3,4].
                                                                                                                                                                                                                                                                                                                    输出: [3,-1]
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                        对于num1中的数字2,第二个数组中的下一个较大数字是3。
                                                                                                                                                                                                                                                                                                                        对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. nums1nums2中所有元素是唯一的。
                                                                                                                                                                                                                                                                                                                    2. nums1nums2 的数组大小都不超过1000。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int[] nextGreaterElement(int[] nums1, int[] nums2) {
                                                                                                                                                                                                                                                                                                                            Deque<Integer> stack = new ArrayDeque<>();
                                                                                                                                                                                                                                                                                                                            Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                            for (int num : nums2) {
                                                                                                                                                                                                                                                                                                                                while (!stack.isEmpty() && num > stack.peek()) {
                                                                                                                                                                                                                                                                                                                                    map.put(stack.pop(), num);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                stack.push(num);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int[] res = new int[nums1.length];
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < nums1.length; ++i) {
                                                                                                                                                                                                                                                                                                                                res[i] = map.getOrDefault(nums1[i], -1);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17

                                                                                                                                                                                                                                                                                                                    500. 键盘行

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    在这里插入图片描述

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: ["Hello", "Alaska", "Dad", "Peace"]
                                                                                                                                                                                                                                                                                                                    输出: ["Alaska", "Dad"]
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 你可以重复使用键盘上同一字符。
                                                                                                                                                                                                                                                                                                                    2. 你可以假设输入的字符串将只包含字母。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String[] findWords(String[] words) {
                                                                                                                                                                                                                                                                                                                            if (words == null) {
                                                                                                                                                                                                                                                                                                                                return null;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            ArrayList<String> list = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            String[] keyboards = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < words.length; i++) {
                                                                                                                                                                                                                                                                                                                                String word = words[i].toLowerCase();
                                                                                                                                                                                                                                                                                                                                for (int j = 0; j < keyboards.length; j++) {
                                                                                                                                                                                                                                                                                                                                    // 先用word首字符确定属于哪一行
                                                                                                                                                                                                                                                                                                                                    if (keyboards[j].indexOf(word.charAt(0)) > -1) {
                                                                                                                                                                                                                                                                                                                                        // 判断word字符串所有字符是否都属于同一行
                                                                                                                                                                                                                                                                                                                                        boolean match = match(keyboards[j], word, list);
                                                                                                                                                                                                                                                                                                                                        if (match) {
                                                                                                                                                                                                                                                                                                                                            list.add(words[i]);
                                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                                        break;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return list.toArray(new String[list.size()]);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private boolean match(String keyboard, String word, ArrayList<String> list) {
                                                                                                                                                                                                                                                                                                                            for (int i = 1; i < word.length(); i++) {
                                                                                                                                                                                                                                                                                                                                if (keyboard.indexOf(word.charAt(i)) < 0) {
                                                                                                                                                                                                                                                                                                                                    return false;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return true;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32

                                                                                                                                                                                                                                                                                                                    501. 二叉搜索树中的众数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

                                                                                                                                                                                                                                                                                                                    假定 BST 有如下定义:

                                                                                                                                                                                                                                                                                                                    • 结点左子树中所含结点的值小于等于当前结点的值
                                                                                                                                                                                                                                                                                                                    • 结点右子树中所含结点的值大于等于当前结点的值
                                                                                                                                                                                                                                                                                                                    • 左子树和右子树都是二叉搜索树

                                                                                                                                                                                                                                                                                                                    例如:
                                                                                                                                                                                                                                                                                                                    给定 BST [1,null,2,2],

                                                                                                                                                                                                                                                                                                                       1
                                                                                                                                                                                                                                                                                                                        \
                                                                                                                                                                                                                                                                                                                         2
                                                                                                                                                                                                                                                                                                                        /
                                                                                                                                                                                                                                                                                                                       2
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    返回[2].

                                                                                                                                                                                                                                                                                                                    提示:如果众数超过1个,不需考虑输出顺序

                                                                                                                                                                                                                                                                                                                    进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        int max = 0;
                                                                                                                                                                                                                                                                                                                        int cur = 0;
                                                                                                                                                                                                                                                                                                                        TreeNode preNode = null;
                                                                                                                                                                                                                                                                                                                        public int[] findMode(TreeNode root) {
                                                                                                                                                                                                                                                                                                                            ArrayList<Integer> list = new ArrayList<>();
                                                                                                                                                                                                                                                                                                                            findMode(root, list);
                                                                                                                                                                                                                                                                                                                            int[] res = new int[list.size()];
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < list.size(); i++) {
                                                                                                                                                                                                                                                                                                                                res[i] = list.get(i);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private void findMode(TreeNode root, ArrayList<Integer> list) {
                                                                                                                                                                                                                                                                                                                            if (root == null) {
                                                                                                                                                                                                                                                                                                                                return;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            findMode(root.left, list);
                                                                                                                                                                                                                                                                                                                            if (preNode != null && root.val == preNode.val) {
                                                                                                                                                                                                                                                                                                                                cur++;
                                                                                                                                                                                                                                                                                                                            } else {
                                                                                                                                                                                                                                                                                                                                cur = 1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (max < cur) {
                                                                                                                                                                                                                                                                                                                                max = cur;
                                                                                                                                                                                                                                                                                                                                list.clear();
                                                                                                                                                                                                                                                                                                                                list.add(root.val);
                                                                                                                                                                                                                                                                                                                            } else if (max == cur) {
                                                                                                                                                                                                                                                                                                                                list.add(root.val);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            preNode = root;
                                                                                                                                                                                                                                                                                                                            findMode(root.right, list);
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39
                                                                                                                                                                                                                                                                                                                    • 40
                                                                                                                                                                                                                                                                                                                    • 41
                                                                                                                                                                                                                                                                                                                    • 42
                                                                                                                                                                                                                                                                                                                    • 43

                                                                                                                                                                                                                                                                                                                    502. IPO

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    假设 力扣(LeetCode)即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。

                                                                                                                                                                                                                                                                                                                    给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

                                                                                                                                                                                                                                                                                                                    总而言之,从给定项目中选择最多 k 个不同项目的列表,以最大化最终资本,并输出最终可获得的最多资本。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: k=2, W=0, Profits=[1,2,3], Capital=[0,1,1].
                                                                                                                                                                                                                                                                                                                    输出: 4
                                                                                                                                                                                                                                                                                                                    解释:
                                                                                                                                                                                                                                                                                                                    由于你的初始资本为 0,你尽可以从 0 号项目开始。
                                                                                                                                                                                                                                                                                                                    在完成后,你将获得 1 的利润,你的总资本将变为 1。
                                                                                                                                                                                                                                                                                                                    此时你可以选择开始 1 号或 2 号项目。
                                                                                                                                                                                                                                                                                                                    由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
                                                                                                                                                                                                                                                                                                                    因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    注意:

                                                                                                                                                                                                                                                                                                                    1. 假设所有输入数字都是非负整数。
                                                                                                                                                                                                                                                                                                                    2. 表示利润和资本的数组的长度不超过 50000。
                                                                                                                                                                                                                                                                                                                    3. 答案保证在 32 位有符号整数范围内。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        /**
                                                                                                                                                                                                                                                                                                                         * 贪心算法
                                                                                                                                                                                                                                                                                                                         */
                                                                                                                                                                                                                                                                                                                        public int findMaximizedCapital(int k, int W, int[] Profits, int[] Capital) {
                                                                                                                                                                                                                                                                                                                            // 首先检查是否存在所有项目都可投资且初始资本 W >= max(Capital) 的情况。如果是,返回利润中前 k 个最大元素的和。
                                                                                                                                                                                                                                                                                                                            boolean speedUp = true;
                                                                                                                                                                                                                                                                                                                            for (int c : Capital) if (W < c) speedUp = false;
                                                                                                                                                                                                                                                                                                                            if (speedUp) {
                                                                                                                                                                                                                                                                                                                                PriorityQueue<Integer> heap = new PriorityQueue<>();
                                                                                                                                                                                                                                                                                                                                for (int p : Profits) {
                                                                                                                                                                                                                                                                                                                                    heap.add(p);
                                                                                                                                                                                                                                                                                                                                    if (heap.size() > k) heap.poll();
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                for (int h : heap) W += h;
                                                                                                                                                                                                                                                                                                                                return W;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int idx;
                                                                                                                                                                                                                                                                                                                            int n = Profits.length;
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < Math.min(k, n); ++i) {
                                                                                                                                                                                                                                                                                                                                idx = -1;
                                                                                                                                                                                                                                                                                                                                // 找到获取利润最多的项目
                                                                                                                                                                                                                                                                                                                                for (int j = 0; j < n; ++j) {
                                                                                                                                                                                                                                                                                                                                    if (W >= Capital[j]) {
                                                                                                                                                                                                                                                                                                                                        if (idx == -1) idx = j;
                                                                                                                                                                                                                                                                                                                                        else if (Profits[idx] < Profits[j]) idx = j;
                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                // 找不到合适的项目
                                                                                                                                                                                                                                                                                                                                if (idx == -1) break;
                                                                                                                                                                                                                                                                                                                                // 累计当前项目的利润到总利润中,并把当前项目标记为"不可用"(设置成最大整数)
                                                                                                                                                                                                                                                                                                                                W += Profits[idx];
                                                                                                                                                                                                                                                                                                                                Capital[idx] = Integer.MAX_VALUE;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return W;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    } 
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37

                                                                                                                                                                                                                                                                                                                    503. 下一个更大元素 II

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [1,2,1]
                                                                                                                                                                                                                                                                                                                    输出: [2,-1,2]
                                                                                                                                                                                                                                                                                                                    解释: 第一个 1 的下一个更大的数是 2;
                                                                                                                                                                                                                                                                                                                    数字 2 找不到下一个更大的数; 
                                                                                                                                                                                                                                                                                                                    第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意: 输入数组的长度不会超过 10000。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int[] nextGreaterElements(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            int len = (n << 1) - 1;
                                                                                                                                                                                                                                                                                                                            int[] res = new int[n];
                                                                                                                                                                                                                                                                                                                            Deque<Integer> stack = new ArrayDeque<>();
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < len; ++i) {
                                                                                                                                                                                                                                                                                                                                int x = nums[i < n ? i : i - n];
                                                                                                                                                                                                                                                                                                                                while (!stack.isEmpty() && x > nums[stack.peek()]) {
                                                                                                                                                                                                                                                                                                                                    res[stack.pop()] = x;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                if (i < n) {
                                                                                                                                                                                                                                                                                                                                    stack.push(i);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            while (!stack.isEmpty()) {
                                                                                                                                                                                                                                                                                                                                res[stack.pop()] = -1;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21

                                                                                                                                                                                                                                                                                                                    504. 七进制数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给定一个整数,将其转化为7进制,并以字符串形式输出。

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: 100
                                                                                                                                                                                                                                                                                                                    输出: "202"
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入: -7
                                                                                                                                                                                                                                                                                                                    输出: "-10"
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    注意: 输入范围是 [-1e7, 1e7] 。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String convertToBase7(int num) {
                                                                                                                                                                                                                                                                                                                            if (num == 0) {
                                                                                                                                                                                                                                                                                                                                return "0";
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            if (num < 0) {
                                                                                                                                                                                                                                                                                                                                return "-" + convertToBase7(-num);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            StringBuilder sb = new StringBuilder();
                                                                                                                                                                                                                                                                                                                            while (num != 0) {
                                                                                                                                                                                                                                                                                                                                sb.append(num % 7);
                                                                                                                                                                                                                                                                                                                                num /= 7;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return sb.reverse().toString();
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16

                                                                                                                                                                                                                                                                                                                    506. 相对名次

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。

                                                                                                                                                                                                                                                                                                                    (注:分数越高的选手,排名越靠前。)

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入: [5, 4, 3, 2, 1]
                                                                                                                                                                                                                                                                                                                    输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
                                                                                                                                                                                                                                                                                                                    解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银牌”和“铜牌” ("Gold Medal", "Silver Medal" and "Bronze Medal").
                                                                                                                                                                                                                                                                                                                    余下的两名运动员,我们只需要通过他们的成绩计算将其相对名次即可。

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    1. N 是一个正整数并且不会超过 10000。
                                                                                                                                                                                                                                                                                                                    2. 所有运动员的成绩都不相同。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public String[] findRelativeRanks(int[] nums) {
                                                                                                                                                                                                                                                                                                                            int n = nums.length;
                                                                                                                                                                                                                                                                                                                            Integer[] index = new Integer[n];
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                index[i] = i;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            Arrays.sort(index, (o1, o2) -> Integer.compare(nums[o2], nums[o1]));
                                                                                                                                                                                                                                                                                                                            String[] res = new String[n];
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < n; ++i) {
                                                                                                                                                                                                                                                                                                                                if (i == 0) {
                                                                                                                                                                                                                                                                                                                                    res[index[i]] = "Gold Medal";
                                                                                                                                                                                                                                                                                                                                } else if (i == 1) {
                                                                                                                                                                                                                                                                                                                                    res[index[i]] = "Silver Medal";
                                                                                                                                                                                                                                                                                                                                } else if (i == 2) {
                                                                                                                                                                                                                                                                                                                                    res[index[i]] = "Bronze Medal";
                                                                                                                                                                                                                                                                                                                                } else {
                                                                                                                                                                                                                                                                                                                                    res[index[i]] = String.valueOf(i + 1);
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23

                                                                                                                                                                                                                                                                                                                    507. 完美数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。

                                                                                                                                                                                                                                                                                                                    给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例:

                                                                                                                                                                                                                                                                                                                    输入: 28
                                                                                                                                                                                                                                                                                                                    输出: True
                                                                                                                                                                                                                                                                                                                    解释: 28 = 1 + 2 + 4 + 7 + 14
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    输入的数字 n 不会超过 100,000,000. (1e8)

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    public class Solution {
                                                                                                                                                                                                                                                                                                                        public boolean checkPerfectNumber(int num) {
                                                                                                                                                                                                                                                                                                                            if (num == 0 || num == 1) {
                                                                                                                                                                                                                                                                                                                                return false;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int sum = 1;
                                                                                                                                                                                                                                                                                                                            for (int i = 2; i <= Math.sqrt(num); i++) {
                                                                                                                                                                                                                                                                                                                                if (num % i == 0) {
                                                                                                                                                                                                                                                                                                                                    sum = sum + i + num / i;
                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return num == sum;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14

                                                                                                                                                                                                                                                                                                                    508. 出现次数最多的子树元素和

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例 1
                                                                                                                                                                                                                                                                                                                    输入:

                                                                                                                                                                                                                                                                                                                      5
                                                                                                                                                                                                                                                                                                                     /  \
                                                                                                                                                                                                                                                                                                                    2   -3
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    返回 [2, -3, 4],所有的值均只出现一次,以任意顺序返回所有值。

                                                                                                                                                                                                                                                                                                                    示例 2
                                                                                                                                                                                                                                                                                                                    输入:

                                                                                                                                                                                                                                                                                                                      5
                                                                                                                                                                                                                                                                                                                     /  \
                                                                                                                                                                                                                                                                                                                    2   -5
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    返回 [2],只有 2 出现两次,-5 只出现 1 次。

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    提示: 假设任意子树元素和均可以用 32 位有符号整数表示。

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    /**
                                                                                                                                                                                                                                                                                                                     * Definition for a binary tree node.
                                                                                                                                                                                                                                                                                                                     * public class TreeNode {
                                                                                                                                                                                                                                                                                                                     *     int val;
                                                                                                                                                                                                                                                                                                                     *     TreeNode left;
                                                                                                                                                                                                                                                                                                                     *     TreeNode right;
                                                                                                                                                                                                                                                                                                                     *     TreeNode(int x) { val = x; }
                                                                                                                                                                                                                                                                                                                     * }
                                                                                                                                                                                                                                                                                                                     */
                                                                                                                                                                                                                                                                                                                    public class Solution {
                                                                                                                                                                                                                                                                                                                        // 后续遍历,遍历的同时,找最大值和计算次数
                                                                                                                                                                                                                                                                                                                        Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                        int max = Integer.MIN_VALUE;
                                                                                                                                                                                                                                                                                                                        public int[] findFrequentTreeSum(TreeNode root) {
                                                                                                                                                                                                                                                                                                                            if (root == null) {
                                                                                                                                                                                                                                                                                                                                return new int[0];
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            dfs(root);
                                                                                                                                                                                                                                                                                                                            List<Integer> list = map.entrySet().stream()
                                                                                                                                                                                                                                                                                                                                    .filter(m -> m.getValue() == max).map(i -> i.getKey()).collect(Collectors.toList());
                                                                                                                                                                                                                                                                                                                            int[] res = new int[list.size()];
                                                                                                                                                                                                                                                                                                                            for (int i = 0; i < list.size(); i++) {
                                                                                                                                                                                                                                                                                                                                res[i] = list.get(i);
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                        private int dfs(TreeNode root) {
                                                                                                                                                                                                                                                                                                                            if (root == null) {
                                                                                                                                                                                                                                                                                                                                return 0;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int left = dfs(root.left);
                                                                                                                                                                                                                                                                                                                            int right = dfs(root.right);
                                                                                                                                                                                                                                                                                                                            int sum = root.val + left + right;
                                                                                                                                                                                                                                                                                                                            int current = map.getOrDefault(sum, 0) + 1;
                                                                                                                                                                                                                                                                                                                            map.put(sum, current);
                                                                                                                                                                                                                                                                                                                            max = Math.max(current, max);
                                                                                                                                                                                                                                                                                                                            return sum;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    • 16
                                                                                                                                                                                                                                                                                                                    • 17
                                                                                                                                                                                                                                                                                                                    • 18
                                                                                                                                                                                                                                                                                                                    • 19
                                                                                                                                                                                                                                                                                                                    • 20
                                                                                                                                                                                                                                                                                                                    • 21
                                                                                                                                                                                                                                                                                                                    • 22
                                                                                                                                                                                                                                                                                                                    • 23
                                                                                                                                                                                                                                                                                                                    • 24
                                                                                                                                                                                                                                                                                                                    • 25
                                                                                                                                                                                                                                                                                                                    • 26
                                                                                                                                                                                                                                                                                                                    • 27
                                                                                                                                                                                                                                                                                                                    • 28
                                                                                                                                                                                                                                                                                                                    • 29
                                                                                                                                                                                                                                                                                                                    • 30
                                                                                                                                                                                                                                                                                                                    • 31
                                                                                                                                                                                                                                                                                                                    • 32
                                                                                                                                                                                                                                                                                                                    • 33
                                                                                                                                                                                                                                                                                                                    • 34
                                                                                                                                                                                                                                                                                                                    • 35
                                                                                                                                                                                                                                                                                                                    • 36
                                                                                                                                                                                                                                                                                                                    • 37
                                                                                                                                                                                                                                                                                                                    • 38
                                                                                                                                                                                                                                                                                                                    • 39

                                                                                                                                                                                                                                                                                                                    509. 斐波那契数

                                                                                                                                                                                                                                                                                                                    题目描述

                                                                                                                                                                                                                                                                                                                    斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

                                                                                                                                                                                                                                                                                                                    F(0) = 0,   F(1) = 1
                                                                                                                                                                                                                                                                                                                    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    给定 N,计算 F(N)

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    示例 1:

                                                                                                                                                                                                                                                                                                                    输入:2
                                                                                                                                                                                                                                                                                                                    输出:1
                                                                                                                                                                                                                                                                                                                    解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 2:

                                                                                                                                                                                                                                                                                                                    输入:3
                                                                                                                                                                                                                                                                                                                    输出:2
                                                                                                                                                                                                                                                                                                                    解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                    示例 3:

                                                                                                                                                                                                                                                                                                                    输入:4
                                                                                                                                                                                                                                                                                                                    输出:3
                                                                                                                                                                                                                                                                                                                    解释:F(4) = F(3) + F(2) = 2 + 1 = 3.
                                                                                                                                                                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                     

                                                                                                                                                                                                                                                                                                                    提示:

                                                                                                                                                                                                                                                                                                                    • 0 ≤ N ≤ 30

                                                                                                                                                                                                                                                                                                                    解法

                                                                                                                                                                                                                                                                                                                    Java

                                                                                                                                                                                                                                                                                                                    class Solution {
                                                                                                                                                                                                                                                                                                                        public int fib(int N) {
                                                                                                                                                                                                                                                                                                                            if (N < 2) {
                                                                                                                                                                                                                                                                                                                                return N;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            int a = 0, b = 1;
                                                                                                                                                                                                                                                                                                                            int res = 0;
                                                                                                                                                                                                                                                                                                                            for (int i = 2; i <= N; ++i) {
                                                                                                                                                                                                                                                                                                                                res = a + b;
                                                                                                                                                                                                                                                                                                                                a = b;
                                                                                                                                                                                                                                                                                                                                b = res;
                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                            return res;
                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                    • 1
                                                                                                                                                                                                                                                                                                                    • 2
                                                                                                                                                                                                                                                                                                                    • 3
                                                                                                                                                                                                                                                                                                                    • 4
                                                                                                                                                                                                                                                                                                                    • 5
                                                                                                                                                                                                                                                                                                                    • 6
                                                                                                                                                                                                                                                                                                                    • 7
                                                                                                                                                                                                                                                                                                                    • 8
                                                                                                                                                                                                                                                                                                                    • 9
                                                                                                                                                                                                                                                                                                                    • 10
                                                                                                                                                                                                                                                                                                                    • 11
                                                                                                                                                                                                                                                                                                                    • 12
                                                                                                                                                                                                                                                                                                                    • 13
                                                                                                                                                                                                                                                                                                                    • 14
                                                                                                                                                                                                                                                                                                                    • 15
                                                                                                                                                                                                                                                                                                                    本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/117758
                                                                                                                                                                                                                                                                                                                    推荐阅读
                                                                                                                                                                                                                                                                                                                    相关标签
                                                                                                                                                                                                                                                                                                                      

                                                                                                                                                                                                                                                                                                                    闽ICP备14008679号