LeetCode每日刷题:(单调队列+队列+二叉树+字符串)&(动态规划+递归)

1.单调队列:滑动窗口的最大值

在这里插入图片描述

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        // //1.暴力法
        // int n=nums.length;
        // if(n==0 || k==0) return new int[0];
        // int[] res=new int[n-k+1];
        // for(int i=0;i<n-k+1;i++){
        //     int max=nums[i];
        //     for(int j=i;j<i+k;j++){
        //         max=Math.max(max,nums[j]);
        //     }
        //     res[i]=max;
        // }
        // return res;

        //2.单调队列
        //队列里存放的是当前窗口的值,并且要单调递减,这样队列首部就是窗口最大值
        //(1)当窗口要右移时,如果nums[i-1]是当前窗口最大值,要从队列中移除nums[i-1]
        //(2)当向窗口中添加元素nums[j]时,要移除窗口中小于nums[j]的值
        //(3)向队列尾部添加元素nums[j]
        int n=nums.length;
        if(n==0 || k==0) return new int[0];
        int[] res=new int[n-k+1];
        Deque<Integer> deque=new LinkedList<>();
        for(int j=0,i=1-k;j<nums.length;j++,i++){
            if(i>0 && deque.peekFirst()==nums[i-1]){
                deque.removeFirst();
            }
            while(!deque.isEmpty() && nums[j]>deque.peekLast()){
                deque.removeLast();
            }
            deque.addLast(nums[j]);
            if(i>=0){
                res[i]=deque.peekFirst();
            }
        }
        return res;
    }
}

2.队列:队列的最大值

在这里插入图片描述

class MaxQueue {
    Deque<Integer> quque;//数据队列
    Deque<Integer> deque;//辅助双端队列
    public MaxQueue() {
        quque=new LinkedList<Integer>();
        deque=new LinkedList<Integer>();
    }
    
    public int max_value() {
        if(deque.isEmpty()){
            return -1;
        }else{
            return deque.peekFirst();
        }
    }
    
    public void push_back(int value) {
        quque.offer(value);
        while(!deque.isEmpty() && deque.peekLast()<value){
            deque.removeLast();
        }
        deque.offerLast(value);
    }
    
    public int pop_front() {
        if(quque.isEmpty()){
            return -1;
        }
        int res=quque.poll();
        if(res==deque.peekFirst()){
            deque.pollFirst();
        }        
        return res;
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */

借助双端队列做辅助

3.动态规划:n个骰子的点数

在这里插入图片描述
大神的题解。。。懵懵的

class Solution {
    public double[] dicesProbability(int n) {
        //动态规划:
        //状态:(1)已经使用骰子的个数(2)骰子总和 dp[i][j]
        int[][] dp=new int[n+1][6*n+1];
        //base case
        for(int i=1;i<=6;i++){
            dp[1][i]=1;
        }
        for(int i=2;i<=n;i++){//骰子个数
            for(int j=i;j<=6*i;j++){//骰子总和
                for(int k=1;k<=6 && k<=j;k++){//骰子拆分dianshu
                    dp[i][j]+=dp[i-1][j-k];
                }
            }
        }
        double[] ans=new double[6*n-n+1];
        for(int i=n;i<=6*n;i++){
            ans[i-n]=((double)dp[n][i])/Math.pow(6,n);
        }
        return ans;
    }
}

4.二叉树递归:二叉树的最近公共祖先

在这里插入图片描述

/**
 * 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;
    }
}

5.字符串:把字符串转换成整数

在这里插入图片描述
在这里插入图片描述

class Solution {
    public int strToInt(String str) {
        char[] c = str.trim().toCharArray();
        if(c.length == 0) return 0;

        int res = 0, bndry = Integer.MAX_VALUE / 10;
        int i = 1, sign = 1;
        if(c[0] == '-') sign = -1;
        else if(c[0] != '+') i = 0;

        for(int j = i; j < c.length; j++) {
            if(c[j] < '0' || c[j] > '9') break;
            if(res > bndry || res == bndry && c[j] > '7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + (c[j] - '0');
        }
        
        return sign * res;
    }
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值