LeetCode 每日一题 Day 3334(hard)35 ||二进制枚举/单调栈/链表遍历

2397. 被列覆盖的最多行数

给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix ;另给你一个整数 numSelect,表示你必须从 matrix 中选择的 不同 列的数量。

如果一行中所有的 1 都被你选中的列所覆盖,则认为这一行被 覆盖 了。

形式上,假设 s = {c1, c2, …, cnumSelect} 是你选择的列的集合。对于矩阵中的某一行 row ,如果满足下述条件,则认为这一行被集合 s 覆盖:

对于满足 matrix[row][col] == 1 的每个单元格 matrix[row][col](0 <= col <= n - 1),col 均存在于 s 中,或者
row 中 不存在 值为 1 的单元格。
你需要从矩阵中选出 numSelect 个列,使集合覆盖的行数最大化。

返回一个整数,表示可以由 numSelect 列构成的集合 覆盖 的 最大行数 。

示例 1:
在这里插入图片描述

输入:matrix = [[0,0,0],[1,0,1],[0,1,1],[0,0,1]], numSelect = 2
输出:3
解释:
图示中显示了一种覆盖 3 行的可行办法。
选择 s = {0, 2} 。

  • 第 0 行被覆盖,因为其中没有出现 1 。
  • 第 1 行被覆盖,因为值为 1 的两列(即 0 和 2)均存在于 s 中。
  • 第 2 行未被覆盖,因为 matrix[2][1] == 1 但是 1 未存在于 s 中。
  • 第 3 行被覆盖,因为 matrix[2][2] == 1 且 2 存在于 s 中。
    因此,可以覆盖 3 行。
    另外 s = {1, 2} 也可以覆盖 3 行,但可以证明无法覆盖更多行。

示例 2:

在这里插入图片描述

输入:matrix = [[1],[0]], numSelect = 1
输出:2
解释:
选择唯一的一列,两行都被覆盖了,因为整个矩阵都被覆盖了。
所以我们返回 2 。

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 12
matrix[i][j] 要么是 0 要么是 1
1 <= numSelect <= n

二进制枚举(灵神题解):

class Solution {
public:int maximumRows(vector<vector<int>> &mat, int numSelect) {int m = mat.size(), n = mat[0].size();vector<int> mask(m);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {mask[i] |= mat[i][j] << j;}}int ans = 0;for (int subset = 0; subset < (1 << n); subset++) {if (__builtin_popcount(subset) == numSelect) {int covered_rows = 0;for (int row : mask) {if ((row & subset) == row) {covered_rows++;}}ans = max(ans, covered_rows);}}return ans;}
};

而我的代码时间和空间占用都太高了,虽然是比较直观的:

class Solution {
public:int maximumRows(vector<vector<int>>& mat, int cols) {int m = mat.size(), n = mat[0].size();if(cols == n) return m;int ans = 0;vector<int> tmp;for(int i = 0; i < m; i++) {int num = 0;for(int j = 0; j < n; j++) {if(mat[i][j]) num++;}tmp.push_back(num);}for(int i = 1; i < (1<<n); i++) {vector<int> v;int k = i;for(int j = 0; j < n && k > 0; j++) {if(k & 1) v.push_back(j);k >>= 1;}if(v.size() == cols) {int res = 0;for(int t = 0; t < m; t++) {if(tmp[t] > cols) continue;int sum = 0;for(int q = 0; q < v.size(); q++) {if(mat[t][v[q]]) sum++;}if(sum == tmp[t]) res++;}ans = max(ans, res);}}return ans;}
};

1944. 队列中可以看到的人数

有 n 个人排成一个队列,从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights ,每个整数 互不相同,heights[i] 表示第 i 个人的高度。

一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的,第 i 个人能看到第 j 个人的条件是 i < j 且 min(heights[i], heights[j]) > max(heights[i+1], heights[i+2], ..., heights[j-1])

请你返回一个长度为 n 的数组 answer ,其中 answer[i] 是第 i 个人在他右侧队列中能 看到 的 人数 。

示例 1:
在这里插入图片描述

输入:heights = [10,6,8,5,11,9]
输出:[3,1,2,1,1,0]
解释:
第 0 个人能看到编号为 1 ,2 和 4 的人。
第 1 个人能看到编号为 2 的人。
第 2 个人能看到编号为 3 和 4 的人。
第 3 个人能看到编号为 4 的人。
第 4 个人能看到编号为 5 的人。
第 5 个人谁也看不到因为他右边没人。

示例 2:

输入:heights = [5,1,2,3,10]
输出:[4,1,1,1,0]

提示:

n == heights.length
1 <= n <= 105
1 <= heights[i] <= 105
heights 中所有数 互不相同 。

虽然是hard题,但是实际上是中等题的难度(但我还是看了题解,太菜了),很明显的单调栈解决,及时去掉无用数据:

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {int n = heights.size();vector<int> stack;vector<int> res(n, 0);for (int i = n - 1; i >= 0; i--) {int h = heights[i];while (!stack.empty() && stack.back() < h) {stack.pop_back();res[i] += 1;}if (!stack.empty()) {res[i] += 1;}stack.push_back(h);}return res;}
};

2807. 在链表中插入最大公约数

给你一个链表的头 head ,每个结点包含一个整数值。

在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。

请你返回插入之后的链表。

两个数的 最大公约数 是可以被两个数字整除的最大正整数。

示例 1:
在这里插入图片描述

输入:head = [18,6,10,3]
输出:[18,6,6,2,10,1,3]
解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。

  • 18 和 6 的最大公约数为 6 ,插入第一和第二个结点之间。
  • 6 和 10 的最大公约数为 2 ,插入第二和第三个结点之间。
  • 10 和 3 的最大公约数为 1 ,插入第三和第四个结点之间。
    所有相邻结点之间都插入完毕,返回链表。

示例 2:

在这里插入图片描述

输入:head = [7]
输出:[7]
解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。
没有相邻结点,所以返回初始链表。

提示:

链表中结点数目在 [1, 5000] 之间。
1 <= Node.val <= 1000

这个题灵神的题解实在是太优雅了,这里就不贴出我的菜鸡代码了orz
遍历链表

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode *insertGreatestCommonDivisors(ListNode *head) {for (auto cur = head; cur->next; cur = cur->next->next) {cur->next = new ListNode(gcd(cur->val, cur->next->val), cur->next);}return head;}
};

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

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

相关文章

CPU算力分配(100用例)C卷 (JavaPythonC语言C++Node.js)

现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力,一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,并且要求从…

认识jmeter接口测试工具!

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;​​​​​​Apache JMeter - Download Apache JMeter 安装 由于Jmeter…

学会视频剪辑方法:从视频中提取封面,增加视频观看量

在数字媒体时代&#xff0c;视频已经成为信息传递的主要方式之一。那如何让视频在众多内容中脱颖而出&#xff0c;吸引更多的观众呢&#xff1f;除了内容本身的质量外&#xff0c;视频的封面也是吸引的关键因素之一。下面一起看云炫AI智剪如何通过视频剪辑方法从视频中提取封面…

Docker的一个简单例子(二)

文章目录 环境示例持久化数据bind mount多容器应用Docker Compose 参考 环境 RHEL 9.3Docker Community 24.0.7 示例 持久化数据 默认情况下&#xff0c;各个容器之间的文件系统是相互独立的。即使两个容器来自同一个image&#xff0c;对其中一个容器的修改&#xff0c;对另…

React之useRef hook

介绍 useRef是react的自定义hook&#xff0c;它用来引用一个不需要渲染的值。这篇文章会介绍useRef的简单用法。 使用场景 1.实现节流 通过useRef实现节流功能&#xff0c;在限制时间内多次提交&#xff0c;已第一次提交为准。 useThrottle.jsx import {useEffect, useRef,…

网络安全常见漏洞类型总结

网络安全常见漏洞类型总结 1、弱口令 原因&#xff1a; 与个人习惯和安全意识相关&#xff0c;为了避免忘记密码&#xff0c;使用一个非常容易记住的密码&#xff0c;或者是直接采用系统的默认密码等。 危害&#xff1a; 通过弱口令&#xff0c;攻击者可以进入后台修改资料&a…

【无标题】finalshell 上传php文件,出现500错误的问题

finalshell 上传php文件&#xff0c;运行时出现500错误的问题 多方查找发现是因为上传后文件的权限不够 上传后的权限 rz -yls -ll -rw------- 1 root root 6 17:38 b.php 修改文件权限就可以正常执行了 chmod r b.php 或者 chmod w b.php finalshell 没有找到如何在…

TVbox开发Python语言

使用 Python 编写的电视盒子&#xff08;TV Box&#xff09;用到相关的组件和库的例子&#xff1a; 操作系统交互 - os, sys 用于操作系统级别的交互&#xff0c;如文件系统操作、系统参数获取等。 图形用户界面 (GUI) - tkinter, PyQt, Kivy 用于创建用户界面。 视频播放和处…

leetcode算法题之递归--综合练习(二)

本章目录 1.N皇后2.有效的数独3.解数独4.单词搜索5.黄金矿工6.不同路径III 1.N皇后 N皇后 class Solution {vector<vector<string>> ret;vector<string> path;int n;bool checkCol[10],checkDig1[20],checkDig2[20]; public:vector<vector<string&g…

2024 IRIS CTF-PWN-【insanity-check】

文章目录 __attribute__((section(".flag")))insanity-check源码exp attribute((section(“.flag”))) attribute相关知识 attribute相关知识 insanity-check 源码 发现溢出后字符串末尾的.com和四个空字符就是函数win&#xff08;&#xff09;的地址&#xff0c…

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…

conda安装transformers、wordcloud库

conda安装transformers库 使用 conda 自 Transformers 4.0.0 版始&#xff0c;我们有了一个 conda 频道&#xff1a; huggingface。 &#x1f917; Transformers 可以通过 conda 依此安装&#xff1a; conda install -c huggingface transformers安装起来就很通畅 conda查看…

[设计模式 Go实现] 结构型~装饰模式

装饰模式使用对象组合的方式动态改变或增加对象行为。 Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式。 使用匿名组合&#xff0c;在装饰器中不必显式定义转调原对象方法。 decorator.go package decoratortype Component interface {Calc() int }type Concre…

NGINX 配置本地HTTPS(免费证书)

生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 2048 会有两次要求输入密码,输入同一个即可。输入密码然后你就获得了一个server.key文件。 以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令: $ op…

【JVM】一篇通关JMM内存模型

JMM内存模型 1. 原子性1-1. 问题分析1-2. 问题解决 2. 可见性2-1. 问题分析2-2. 问题解决 3. 有序性3-1. 问题分析3-2. 问题解决 4. CAS与原子性5. synchronized 优化 1. 原子性 很多人将【java 内存结构】与【java 内存模型】傻傻分不清&#xff0c;【java 内存模型】是 Java…

C++ queue

目录 一、介绍 二、queue使用 三、模拟实现 四、优先级队列 五、priority_queue使用 OJ题&#xff1a;215. 数组中的第K个最大元素 快速排序 优先级队列 TOPK 六、模拟实现priority_queue 1、仿函数 2、优先级队列类 3、测试函数 一、介绍 1、队列是一种容器适配器…

【React系列】高阶组件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 高阶组件 1.1. 认识高阶组件 什么是高阶组件呢&#xff1f;相信很多同学都听说过&#xff0c;也用过 高阶函数&…

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…

力扣(leetcode)第389题找不同(Python)

389.找不同 题目链接&#xff1a;389.找不同 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1&#xff1a; 输入&#xff1a;s “abcd”, t “abcde…

Vue页面传值:Props属性与$emit事件的应用介绍

一、vue页面传值 在Vue页面中传值有多种方式&#xff0c;简单介绍以下两种 通过props属性传递值&#xff1a;父组件在子组件上定义props属性&#xff0c;子组件通过props接收父组件传递的值。通过$emit触发事件传递值&#xff1a;子组件通过$emit方法触发一个自定义事件&#…