Leetcode contests 95 题解

简介: 用容斥原理可以计算出一个数字Num之下有多少个A或B的倍数cnt,我们从最大值二分这个数字Num,拿cnt和N做比较来决定二分的走向,最终l和r肯定会收敛到一起,这就是我们要的结果了。 这道题的数值范围不是特别大 ,用long就可以完全满足需求了。

876. Middle of the Linked List

 简单题,我的做法是先数下个数,然后知道中间节点是第几个了。


class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode p = head;
        int cnt = 0;
        while (p != null) {
            cnt++;
            p = p.next;
        }
        cnt /=2;
        p = head;
        while (cnt>0) {
            p = p.next;
            cnt--;
        }
        return p;
    }
}

877. Stone Game

 这道题我用了记忆化搜索,用递归暴搜可能是能获取到正确结果的,但是直接的递归在重复计算好东西,所以我用dp数组把计算出来的结果保存起来,用的时候直接调取结果,可以减少递归树中重复的部分。

 dp[i][j][0] 表示[i,j]区间Alice能取到的最优结果,dp[i][j][1]表示[i,j]区间Lee能取到最优的结果。

class Solution {
    int[][][] dp;
    public boolean stoneGame(int[] piles) {
        dp = new int[piles.length][piles.length][2];
        int len = piles.length;
        int sum = 0;
        for (int i = 0; i < len; i++) {
            dp[i][i][0] = piles[i];
            dp[i][i][1] = piles[i];
            sum += piles[i];
        }
        return  help(0, len-1, 0, piles)> sum/2;
    }
    private int help(int i, int j, int pos, int[] piles) {
        if (dp[i][j][pos] != 0) {
            return dp[i][j][pos];
        }
        int newpos = pos^1;
        dp[i][j][newpos] = Math.max(help(i+1, j, newpos, piles), help(i, j-1, newpos, piles));
        dp[i][j][pos] = Math.max(help(i+1, j, newpos, piles)+piles[i+1], help(i, j-1, newpos, piles)+piles[j-1]);
        return dp[i][j][pos];
    }
}

878. Nth Magical Number

  用容斥原理可以计算出一个数字Num之下有多少个A或B的倍数cnt,我们从最大值二分这个数字Num,拿cnt和N做比较来决定二分的走向,最终l和r肯定会收敛到一起,这就是我们要的结果了。

  这道题的数值范围不是特别大 ,用long就可以完全满足需求了。

class Solution {
    private long gcd(long x, long y) {
        if (x%y == 0)
            return y;
        return gcd(y, x%y);
    }
    public int nthMagicalNumber(int N, int A, int B) {
        long C = 1l*A*B/gcd(A, B);
        long r = 1000000000l*40000*40000;
        long l = 0;
        while(l < r) {
            long mid = (l+r)/2;
            long cnt = mid/A + mid/B - mid/C;
            if (cnt < N)
                l = mid+1;
            else
                r = mid;
        }
        return (int) (l%1000000007);
    }
}
目录
相关文章
C#线程锁
C#线程锁
55 1
|
12月前
|
缓存 负载均衡 API
抖音抖店API请求获取宝贝详情数据、原价、销量、主图等参数可支持高并发调用接入演示
这是一个使用Python编写的示例代码,用于从抖音抖店API获取商品详情,包括原价、销量和主图等信息。示例展示了如何构建请求、处理响应及提取所需数据。针对高并发场景,建议采用缓存、限流、负载均衡、异步处理及代码优化等策略,以提升性能和稳定性。
|
9月前
|
敏捷开发 监控 数据可视化
作为 J 人,如何挑选适合金融团队的办公软件?
新年钟声敲响,金融行业迎来新的征程。投资、风控和客户服务团队需紧密协作,高效应对市场变化。具备J人特质的金融从业者注重规划与效率,高效的团队协作至关重要。选对办公软件是提升协作效率的关键。本文深入剖析六款可视化团队协作办公软件:板栗看板、Trello、Asana、Monday.com、Jira和Airtable,为J人主导的金融团队提供全面选型指南。其中,板栗看板以卓越的任务可视化管理、灵活自定义工作流及无缝实时沟通脱颖而出,助力团队在复杂多变的金融市场中高效运作,取得优异成绩。
114 0
|
缓存 安全 固态存储
计算机提高计算机运行速度
【8月更文挑战第4天】
260 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的社区车位租赁系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的社区车位租赁系统的详细设计和实现(源码+lw+部署文档+讲解等)
121 1
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
JavaScript 数据库 UED
Vue 的动态菜单表格数据展示以及分页查询实现
Vue 的动态菜单表格数据展示以及分页查询实现
270 0
|
存储 SQL 安全
2022-渗透测试-OWASP TOP10详细讲解
2022-渗透测试-OWASP TOP10详细讲解
2022-渗透测试-OWASP TOP10详细讲解
|
网络协议 关系型数据库 MySQL
Open Source Instant Messaging (IM) Project OpenIM Source Code
Open Source Instant Messaging (IM) Project OpenIM Source Code
220 0