力扣记录:Hot100(8)——253-322

本次题目

      • 253 会议室 II
      • 279 完全平方数
      • 283 移动零
      • 287 寻找重复数
      • 297 二叉树的序列化与反序列化
      • 300 最长递增子序列
      • 301 删除无效的括号
      • 309 最佳买卖股票时机含冷冻期
      • 312 戳气球
      • 322 零钱兑换

253 会议室 II

  • 题目:有一个会议时间安排的二维数组,每个会议时间包括开始和结束之间[start, end],每个会议需要一间会议室,返回所需会议室的最小数量

    • 示例:输入[[0, 30], [5, 10], [15, 20]]输出2
  • 贪心,参考贪心算法的区间问题,不重叠的区间可以使用一间会议室,因此需要找出每个时间段重叠的区间数的最大值

279 完全平方数

  • 动态规划,之前做过。定义dp[n]表示和为n的最小平方数个数。遍历1到根号n,dp[n]为dp[n-j^2]中的最小值
    • 时间复杂度O(n√n),空间复杂度O(n)
class Solution {
   
    public int numSquares(int n) {
   
        //动态规划,定义dp[n]表示和为n的最小平方数个数
        int[] dp = new int[n + 1];
        dp[0] = 0;  //初始化(dp[16]应为0 + 1 = 1)
        //遍历1到根号n,dp[n]为dp[n-j^2]中的最小值
        for(int i = 1; i <= n; i++){
   
            int res = i;    //最大个数为i,即i个1相加
            for(int j = 1; j * j <= i; j++){
   
                res = Math.min(res, dp[i - j * j]);
            }
            dp[i] = res + 1;
        }
        return dp[n];
    }
}
  • 数学方法:四平方和定理

283 移动零

  • 快慢指针,之前做过。快指针遍历数组,将不为0的数移动到慢指针位置,每移动一次,慢指针递增。
    • 时间复杂度O(n),空间复杂度O(1)
class Solution {
   
    public void moveZeroes(int[] nums) {
   
        //快慢指针,之前做过
        int slow = 0;
        //快指针遍历数组,将不为0的数移动到慢指针位置,每移动一次,慢指针递增
        for(int fast = 0; fast < nums.length; fast++){
   
            if(nums[fast] != 0){
   
                nums[slow] = nums[fast];
                slow++;
            }
        }
        //最后补0
        for(int i = slow; i < nums.length; i++){
   
            nums[i] = 0;
        }
    }
}

287 寻找重复数

  • 快慢指针,参考环形链表I和II,构建i->nums[i]的映射关系。注意:需要从环外位置开始遍历才能找到环的入口,共有n+1个数字,范围是1到n,下标从0到n,因此从0开始遍历。
    • 时间复杂度O(n),空间复杂度O(1)
class Solution {
   
    public int findDuplicate(int[] nums) {
   
        //快慢指针,构建i->nums[i]的映射关系
        //注意:需要从环外位置开始遍历才能找到环的入口,共有n+1个数字,范围是1到n,下标从0到n,因此从0开始遍历
        int slow = 0;
        int fast = 0;
        //判断是否有环,确认相遇位置
        fast = nums[nums[fast]];
        slow = nums[slow];
        while(slow != fast){
   
            fast = nums[nums[fast]];
            slow = nums[slow];
        }
        //判断环入口
        int head = 0;
        while(head != slow){
   
            head = nums[head];
            slow = nums[slow];
        }
        return head;
    }
}

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

  • 复习二叉树的遍历,同JZ37 序列化二叉树,使用层序遍历。
    • 时间复杂度O(n),空间复杂度O(n)
public class Codec {
   

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
   
        if(root == null) return "";
        //层序遍历
        StringBuilder sb = new StringBuilder();
        ArrayList<String> arr = new ArrayList<>();
        Queue<TreeNode<

你可能感兴趣的:(Hot100,LeetCode,leetcode,算法,贪心算法)