【LeetCode每日一题合集】2023.10.16-2023.10.22(只出现一次的数字Ⅲ)

news2024/11/18 1:42:32

文章目录

  • 260. 只出现一次的数字 III⭐(异或)🐂
  • 2652. 倍数求和
  • 2530. 执行 K 次操作后的最大分数
  • 1726. 同积元组(哈希表+组合数学)
  • 2525. 根据规则将箱子分类(按题意模拟,分类讨论)
  • 2316. 统计无向图中无法互相到达点对数
    • 解法1——并查集
    • 解法2——dfs求连通块大小
  • 1402. 做菜顺序
    • 解法1——动态规划
    • 解法2——贪心⭐

260. 只出现一次的数字 III⭐(异或)🐂

https://leetcode.cn/problems/single-number-iii/description/?envType=daily-question&envId=2023-10-16

在这里插入图片描述

提示:
2 <= nums.length <= 3 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
除两个只出现一次的整数外,nums 中的其他数字都出现两次


类似分治的思想。
先将数组全部异或,得出的结果是两个只出现一次数字的异或结果。
其中一定有1,因为这两个数字不同。
取出其最低位的1作为判断标准对原数组分组(实际上任意位的1都可以),分成的两组分别包括这两个只出现一次的数字。
这样就把问题转换成了两个 136. 只出现一次的数字

class Solution {
    public int[] singleNumber(int[] nums) {
        int xor = 0;
        for (int num: nums) xor ^= num;
        int mask = xor & (-xor);    // 获取最低位的1
        int[] ans = new int[2];
        for (int num: nums) {
            if ((num & mask) == 0) ans[0] ^= num;
            else ans[1] ^= num;
        }
        return ans;
    }
}

2652. 倍数求和

https://leetcode.cn/problems/sum-multiples/description/?envType=daily-question&envId=2023-10-17

在这里插入图片描述

提示:
1 <= n <= 10^3

解法1——枚举模拟

class Solution {
    public int sumOfMultiples(int n) {
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            if (i % 3 == 0 || i % 5 == 0 || i % 7 == 0) ans += i;
        }
        return ans;
    }
}

解法2—— O ( 1 ) O(1) O(1)容斥原理

class Solution {
    int n;
    public int sumOfMultiples(int n) {
        this.n = n;
        return s(3) + s(5) + s(7) - s(15) - s(21) - s(35) + s(105);
    }
    // 计算从x~(n/x)x,共n/x项
    public int s(int x) {
        return n / x * (x + n / x * x) / 2;
    }
}

相似题目——1201. 丑数 III(二分查找+容斥原理)

https://leetcode.cn/problems/ugly-number-iii/description/

在这里插入图片描述
提示:
1 <= n, a, b, c <= 10^9
1 <= a * b * c <= 10^18
本题结果在 [1, 2 * 10^9] 的范围内

为什么会想到二分?
因为直接求答案不好求,但是我们可以判断1~x的范围内是否有n个丑数。

class Solution {
    public int nthUglyNumber(int n, int a, int b, int c) {
        long x = lcm(a, b), y = lcm(b, c), z = lcm(a, c), q = lcm(x, y);
        long l = 1, r = (long)2e9;
        while (l < r) {
            long mid = l + r >> 1;
            long aa = mid / a, bb = mid / b, cc = mid / c, xx = mid / x, yy = mid / y, zz = mid / z, qq = mid / q;
            long s = aa + bb + cc - xx - yy - zz + qq;
            if (s < n) l = mid + 1;
            else r = mid;
        }
        return (int)l;
    }

    public long gcd(long a, long b) {
        return b == 0? a: gcd(b, a % b);
    }

    public long lcm(long a, long b) {
        return a / gcd(a, b) * b;
    }
}

2530. 执行 K 次操作后的最大分数

https://leetcode.cn/problems/maximal-score-after-applying-k-operations/description/?envType=daily-question&envId=2023-10-18
在这里插入图片描述
提示:

1 <= nums.length, k <= 10^5
1 <= nums[i] <= 10^9

解法1——贪心+优先队列

每次增加最大的数字即可。

class Solution {
    public long maxKelements(int[] nums, int k) {
        long ans = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
        for (int num: nums) pq.offer(num);
        for (int i = 0; i < k; ++i) {
            int c = pq.poll();
            ans += c;
            pq.offer((c + 2) / 3);
        }
        return ans;
    }
}

解法2—— O ( 1 ) O(1) O(1)空间原地堆化

https://leetcode.cn/problems/maximal-score-after-applying-k-operations/solutions/2487446/o1-kong-jian-zuo-fa-pythonjavacgojsrust-ztx6f/?envType=daily-question&envId=2023-10-18

原地堆化,把 nums 数组当成一个堆。
从 h.length / 2 - 1 开始倒序下沉。

class Solution {
    public long maxKelements(int[] nums, int k) {
        heapify(nums);
        long ans = 0;
        while (k-- > 0) {
            ans += nums[0];
            nums[0] = (nums[0] + 2) / 3;
            sink(nums, 0);      // 下沉
        }
        return ans;
    }

    // 保证h[0]>=max(h[2*i+1],h[2*i+2])
    public void heapify(int[] h) {
        for (int i = h.length / 2 - 1; i >= 0; --i) {
            sink(h, i);
        }
    }

    public void sink(int[] h, int i) {
        int n = h.length;
        while (2 * i + 1 < n) {
            // 挑选左右儿子中更大的和i交换
            int j = 2 * i + 1;          // i的左儿子
            if (j + 1 < n && h[j + 1] > h[j]) j++;
            if (h[j] <= h[i]) break;    // 停止下沉
            swap(h, i, j);
            i = j;
        }
    }

    public void swap(int[] h, int i, int j) {
        int tmp = h[i];
        h[i] = h[j];
        h[j] = tmp;
    }
}

1726. 同积元组(哈希表+组合数学)

https://leetcode.cn/problems/tuple-with-same-product/description/
在这里插入图片描述

提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 10^4
nums 中的所有元素 互不相同

计算出数组中所有两两组合的乘积的各个数量。
那么各个成绩的组合数就是 C x 2 = x ∗ ( x − 1 ) C_x^2=x*(x-1) Cx2=x(x1),即任选两组。每种组合4个数字可以任意排位置,最后结果*4。

class Solution {
    public int tupleSameProduct(int[] nums) {
        int n = nums.length, ans = 0;
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                cnt.merge(nums[i] * nums[j], 1, Integer::sum);
            }
        }
        for (int v: cnt.values()) {
            if (v > 1) ans += v * (v - 1);
        }
        return ans * 4;
    }
}

2525. 根据规则将箱子分类(按题意模拟,分类讨论)

https://leetcode.cn/problems/categorize-box-according-to-criteria/description/?envType=daily-question&envId=2023-10-20

在这里插入图片描述
提示:

1 <= length, width, height <= 10^5
1 <= mass <= 10^3

class Solution {
    public String categorizeBox(int length, int width, int height, int mass) {
        boolean bulky = false, heavy = false;
        if (length >= 10000 || width >= 10000 || height >= 10000 || mass >= 10000 || (long)length * width * height >= 1000000000) bulky = true;
        if (mass >= 100) heavy = true; 
        if (bulky && heavy) return "Both";
        if (!bulky && !heavy) return "Neither";
        if (bulky) return "Bulky";
        return "Heavy";
    }
}

2316. 统计无向图中无法互相到达点对数

https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/description/?envType=daily-question&envId=2023-10-21

在这里插入图片描述

提示:

1 <= n <= 10^5
0 <= edges.length <= 2 * 10^5
edges[i].length == 2
0 <= ai, bi < n
ai != bi
不会有重复边。

解法1——并查集

关于并查集可见:【算法基础:数据结构】2.3 并查集

并查集得出各个联通集合中元素的数量,不同集合中的元素都可以两两组合。

class Solution {
    public long countPairs(int n, int[][] edges) {
        long ans = 0;
        // 并查集
        int[] p = new int[n];
        Arrays.setAll(p, e -> e);
        for (int[] e: edges) {
            if (p[e[0]] != p[e[1]]) p[find(p, e[0])] = find(p, e[1]);
        }
        // 记录每个集合中的元素个数
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int i = 0; i < n; ++i) {
            cnt.merge(find(p, i), 1, Integer::sum);
        }
        for (int v: cnt.values()) {
            ans += (long)v * (n - v);       // 和其它所有集合的一一对应
        }
        return ans / 2;                     // 结果除以2去掉重复计算的
    }

    public int find(int[]p, int x) {
        if (p[x] != x) p[x] = find(p, p[x]);
        return p[x];
    }
}

解法2——dfs求连通块大小

class Solution {
    public long countPairs(int n, int[][] edges) {
        long ans = 0, total = 0;
        List<Integer>[] g = new ArrayList[n];
        boolean[] st = new boolean[n];
        Arrays.setAll(g, e -> new ArrayList<Integer>());
        for (int[] e: edges) {
            g[e[0]].add(e[1]);
            g[e[1]].add(e[0]);
        }
        for (int i = 0; i < n; ++i) {
            if (!st[i]) {
                int cnt = dfs(g, st, i);    // dfs计算连通块大小
                ans += total * cnt;
                total += cnt;
            }
        }
        return ans;
    }

    public int dfs(List<Integer>[] g, boolean[] st, int x) {
        int res = 1;
        st[x] = true;
        for (int y: g[x]) {
            if (!st[y]) {
                res += dfs(g, st, y);
            }
        }
        return res;
    }
}

1402. 做菜顺序

https://leetcode.cn/problems/reducing-dishes/description/?envType=daily-question&envId=2023-10-22

在这里插入图片描述
提示:

n == satisfaction.length
1 <= n <= 500
-1000 <= satisfaction[i] <= 1000

解法1——动态规划

dp[i][j] 表示前 i+1 个菜,选择 j 个时的值。
最后结果是前 n 个菜中,选择 0~n 个时的最大值。

class Solution {
    public int maxSatisfaction(int[] satisfaction) {
        int n = satisfaction.length;
        int[][] dp = new int[n + 1][n + 1];
        Arrays.sort(satisfaction);
        dp[0][1] = satisfaction[0];
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j <= i + 1; ++j) {
                dp[i][j] = dp[i - 1][j - 1] + satisfaction[i] * j;
            }
        }
        return Arrays.stream(dp[n - 1]).max().getAsInt();
    }
}

解法2——贪心⭐

见:https://leetcode.cn/problems/reducing-dishes/solutions/198214/zuo-cai-shun-xu-by-leetcode-solution/?envType=daily-question&envId=2023-10-22

class Solution {
    public int maxSatisfaction(int[] satisfaction) {
        Arrays.sort(satisfaction);
        int ans = 0, s = 0;
        for (int i = satisfaction.length - 1; i >= 0; --i) {
            s += satisfaction[i];
            if (s <= 0) return ans;
            ans += s;
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——代价敏感错误率与代价曲线

文章目录 代价敏感错误率实现代价曲线例子 代价敏感错误率 指在分类问题中&#xff0c;不同类别的错误分类所造成的代价不同。在某些应用场景下&#xff0c;不同类别的错误分类可能会产生不同的代价。例如&#xff0c;在医学诊断中&#xff0c;将疾病患者错误地分类为健康人可…

区块链技术的未来:去中心化应用和NFT的崛起

区块链技术正在以前所未有的速度改变着金融和数字资产领域。它的演进为去中心化应用和非替代性代币&#xff08;NFT&#xff09;的崛起提供了坚实的基础。在本文中&#xff0c;我们将深入探讨这一数字革命的关键方面&#xff0c;从区块链的基本原理到它如何改变金融领域&#x…

修改svc的LoadBalancer的IP引发的惨案

文章目录 背景修改externalIPs的操作api-server报错日志挽救教训 背景 k8s集群没有接外部负载均衡&#xff0c;部署istio的时候ingressgateway一直pending。 于是手动修改了这个lb svc的externalIP&#xff0c;于是k8s就崩了&#xff0c;如何崩的&#xff0c;且听我还道来。 …

Redis(03)| 数据结构-链表

大家最熟悉的数据结构除了数组之外&#xff0c;我相信就是链表了。 Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的&#xff0c;所以 Redis 自己设计了一个链表数据结构。 链表节点结构设计 先来看看「链表节点」结构的样子&#xff1a; type…

ReentrantLock 的实现原理

ReentrantLock ReentrantLock 是一种可重入的排它锁&#xff0c;主要用来解决多线程对共享资源竞争的问题。它的核心特性有几个&#xff1a; 它支持可重入&#xff0c;也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候&#xff0c;不需要加锁就可以直接访问。它支持公…

企业微信接入芋道SpringBoot项目

背景&#xff1a;使用芋道框架编写了一个数据看板功能需要嵌入到企业微信中&#xff0c;方便各级人员实时观看 接入企业微信的话肯定不能像平常pc端一样先登录再根据权限看页面&#xff0c;不然的话不如直接手机浏览器打开登录账号来得更为方便&#xff0c;所以迎面而来面临两…

结构体数组经典运用---选票系统

结构体的引入 1、概念&#xff1a;结构体和其他类型基础数据类型一样&#xff0c;例如int类型&#xff0c;char类型&#xff0c;float类型等。整型数&#xff0c;浮点型数&#xff0c;字符串是分散的数据表示&#xff0c;有时候我们需要用很多类型的数据来表示一个整体&#x…

网络通信 | 内网穿透

内网穿透 / 获取临时域名 : 下载且安装软件 : cpolar获得 “Authtoken” 且配置 cpolar &#xff0c;生成“内网穿透”工具配置文件启动服务&#xff0c;临时获取到一个IP地址 (临时域名) 让当前 电脑能获取一个公网的IP地址&#xff0c;让微信后台能调用到当前外卖系统的后端服…

亚马逊发布卖家专用的AI工具,能为商品添加背景

&#x1f989; AI新闻 &#x1f680; 亚马逊发布卖家专用的AI工具&#xff0c;能为商品添加背景 摘要&#xff1a;亚马逊发布了一款针对卖家的生成式AI工具&#xff0c;允许卖家为商品添加由AI生成的背景。亚马逊称有75%的广告主因广告内容质量不佳而导致营销失败。通过比对两…

企业文件传输速度慢?宽带利用率不高怎么办?

在当今数字化时代&#xff0c;企业间的文件传输已经成为日常工作中不可或缺的一部分。很多企业业务全球化趋势明显&#xff0c;拥有分布在不同地理位置的办事处、工厂、供应商和合作伙伴。它们需要在这些地点之间传输文件&#xff0c;如合同、报告、设计文件等。企业常常需要传…

【Idea】idea启动同一程序不同端口

前言 在idea中配置两个不同端口&#xff0c;同时运行两个相同的主程序。 更多端口配置同理 idea版本:2022.2.3 1.在service中复制一个进程,指定不同端口 右键打开点击 copy Configuration 2.点击Modify option 2. 选择VM option(用于指定新的端口) 页面就会出现下面的指定…

代码随想录算法训练营第3天| 203.移除链表元素 、 707.设计链表 、 206.反转链表

JAVA代码编写 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示…

[Leetcode] 0101. 对称二叉树

101. 对称二叉树 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#…

“智”造时代引领AI机器视觉技术进步,加速渗透下游应用赛道

机器视觉作为智能制造的“智慧之眼”&#xff0c;为智能制造打开了新的“视”界&#xff0c;是实现工业自动化和智能化的关键核心技术。人工智能与机器视觉的结合使用&#xff0c;逐渐成为现阶段研究与应用的热点&#xff0c;同时也成为机器视觉行业发展的核心驱动力。 近年来…

Compose 自定义 - 绘制 Draw

一、概念 所有的绘制操作都是通过调整像素大小来执行的。若要确保项目在不同的设备密度和屏幕尺寸上都能采用一致的尺寸&#xff0c;请务必使用 .toPx() 对 dp 进行转换或者采用小数尺寸。 二、Modifier 修饰符绘制 官方页面 在修饰的可组合项之上或之下绘制。 .drawWithCon…

机器视觉3D项目评估的基本要素及测量案例分析

目录 一. 检测需求确认 1、产品名称&#xff1a;【了解是什么产品上的零件&#xff0c;功能是什么】 2、*产品尺寸&#xff1a;【最大兼容尺寸】 3、*测量项目&#xff1a;【确认清楚测量点位】 4、*精度要求&#xff1a;【若客户提出的精度值过大或者过小&#xff0c;可以和客…

论坛介绍 | COSCon'23 开源文化(GL)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…

hadoop使用简介

git clone hadoop源码地址&#xff1a;https://gitee.com/CHNnoodle/hadoop.git git clone错误&#xff1a; Filename too long错误&#xff0c;使用git config --global core.longpaths true git clone https://gitee.com/CHNnoodle/hadoop.git -b rel/release-3.2.2 拉取指定…

Spigot 通过 BuildTools 构建 MineCraft Spigot 官方服务端文件

文章目录 从 Spigot 官方下载 BuildTools spigotmc / buildtools确保你有正确版本的 Java&#xff08;例如构建 1.20.2 的服务端一般需要有 Java17&#xff09;在 BuildTools.jar 同名文件夹打开 cmd 命令行&#xff08;点击红色圈圈区域输入 cmd 按 enter 即可&#xff09; …

如何查找特定基因集合免疫基因集 炎症基因集

温故而知新&#xff0c;再次看下Msigdb数据库。它更新了很多内容。给我们提供了一个查询基因集的地方。 关注微信&#xff1a;生信小博士 比如纤维化基因集&#xff1a; 打开网址&#xff1a;https://www.gsea-msigdb.org/gsea/msigdb/index.jsp 2.点击search 3.比如我对纤维…