LeetCode百题刷003(449周赛一二题)

遇到的问题都有解决的方案,希望我的博客可以为你提供一些帮助

一、不同字符数量最多为 K 时的最少删除数 (哈希表空间换时间)

不同字符数量最多为 K 时的最少删除数 - 力扣 (LeetCode) 竞赛https://leetcode.cn/contest/weekly-contest-449/problems/minimum-deletions-for-at-most-k-distinct-characters/

思路分析:

  • 题干要求是删除最少的元素以保证剩下的字符串中最多有k种不同的元素(每种元素可以有重复的)并返回删除的元素的个数

问题分解:

  • 问题一:如何去确定要删除哪些元素?
  • 问题二:如何去确定重复种类元素的个数呢?
  • 问题三:如何保证最多有k种元素呢?

针对问题一,我们需要保证删除最少的元素,如果需要删除某些种类元素,首先被删除的元素种类一定是出现次数最少的而不是较多的。那么,我们需要先知道每一种元素出现的次数;其次,如果需要删除某些种类的元素需要逐次删除出现次数最小的。

针对问题二,可以看成一个经典的问题:如何在一个无序序列中统计每一个元素的频率。即构建如下的映射结构 元素:出现次数,可以采用哈希表来解决。

针对问题三,将问题二中的哈希表的大小与k进行比较即可。

问题解决:

数据结构:哈希表

算法设计:

  • 利用哈希表统计每个元素的出现次数
  • 按出现次数升序排序
  • 比较k与哈希表的大小l 
  • 如果l<=k 直接返回 0
  • 如果l>k   不断移除排序后序列的队首(实际上是不断累加首位元素出现的次数),直到l=k,返回累加结果

时间复杂度:O(nlogn)

空间复杂度: O(n)

编码实现(python):

class Solution:def minDeletion(self, s: str, k: int) -> int:#记录元素出现次数的哈希表char_count={}for char in s:char_count[char]=char_count.get(char,0)+1#排序sorted_c=sorted(char_count.items(),key=lambda item : item[1])if len(sorted_c)>k:return sum([x[1] for x in  sorted_c[:len(sorted_c)-k]])else:return 0

提交结果(python): 

 编码实现(c++):

class Solution {
public:int minDeletion(string s, int k) {//哈希表:记录每种元素出现次数unordered_map<char,int> char_count;for(auto c :s){char_count[c]++;}// 将哈希表元素存入 vectorvector<pair<char,int>> sorted_c(char_count.begin(),char_count.end());// 按值升序排序sort(sorted_c.begin(),sorted_c.end(),[](const auto &a,const auto &b){return a.second<b.second;});//计算结果if (sorted_c.size()>k){return accumulate(sorted_c.begin(),sorted_c.end()-k,0,[](int count,const auto &b){return count+b.second;} );}else{return 0;}}
};

提交结果(c++): 

二、等和矩阵分割 I

等和矩阵分割 I - 力扣 (LeetCode) 竞赛https://leetcode.cn/contest/weekly-contest-449/problems/equal-sum-grid-partition-i/

思路分析(这是我当时先想到的一个思路):

题干要求是进行一次水平或者垂直划分,使划分后的二维数组的两部分(非空)的和相等。如果相等返回True,否则返回False

问题分解:

  • 问题一:水平或者垂直划分如何实现?
  • 问题二:如何对划分后的部分进行比较?
  • 问题三:如何判断最终的返回结果?

针对问题一:二维数组有行和列,将每一行看成一个整体,对行操作就是实现水平划分;同理对列操作就是垂直划分

针对问题二和三: 题干要求划分后两部分需要相等,直接比较两部分会比较困难因为我们不知道需要在哪一行或者那一列进行划分,如果枚举出所有可能再筛选时间耗费巨大,这时候不妨思考反面,我可不可以先求出总和(遍历二维数组一次),再按行为单位或者列为单位去遍历二维数组并记录累加和,如果当前累加和等于总和的一半说明划分正确否则不正确。

问题解决:

数据结构:二维数组

算法设计:

  • 遍历数组计算总和
  • 按行为单位或者列为单位去遍历二维数组并记录累加和
  • 比较当前累加和与总和1/2的大小,如果等于则返回True否则返回False 

时间复杂度:O(n*m)

空间复杂度: O(n)

 编码实现(python):

class Solution:def canPartitionGrid(self, grid: List[List[int]]) -> bool:#计算二维数组总和sum_g=0for row in grid:sum_g+=sum(row)if sum_g%2!=0:return False#按行划分sum_r=0;for row in grid:sum_r+=sum(row)if sum_r== sum_g/2:return Trueif sum_r>sum_g/2:#剪枝break#按列划分sum_c=0list_c=[sum(row[i] for row in grid) for i in range(len(grid[0]))]for c in list_c:sum_c+=cif sum_c==sum_g/2:return Trueif sum_c>sum_g/2:breakreturn False

提交结果(python): 

 编码实现(c++):

class Solution {
public:bool canPartitionGrid(vector<vector<int>>& grid) {//求总和long long  sum_g=0;for (auto row:grid){sum_g+=accumulate(row.begin(),row.end(),0LL);}// cout<<sum_g<<endl;//剪枝if (sum_g%2!=0){return false;}//行划分long long sum_r=0;for (auto row:grid){sum_r+=accumulate(row.begin(),row.end(),0LL);cout<<sum_r<<endl;if(sum_r==sum_g/2)return true;if (sum_r>sum_g/2)break;}//列划分long long   sum_c=0;for(int i=0;i<grid[0].size();i++){for(int j=0;j<grid.size();j++)sum_c+=grid[j][i];// cout<<sum_c<<endl;if (sum_c==sum_g/2)return true;if (sum_c>sum_g/2)break;}return false;}
};

提交结果(c++): 

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

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

相关文章

【网安等保】OpenEuler 24.03系统主机安全加固及配置优化实践指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] &#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一个正在向全栈工程师(SecDevOps)前进的计算机技术爱好者&#xff0c;欢迎各位道友一起学习交流、一起进步 &#x1f680;&#xff0…

大模型赋能:2D 写实数字人开启实时交互新时代

在数字化浪潮席卷全球的当下&#xff0c;人工智能技术不断突破创新&#xff0c;其中大模型驱动的 2D 写实数字人正成为实时交互领域的一颗新星&#xff0c;引领着行业变革&#xff0c;为人们带来前所未有的交互体验。 一、2D 写实数字人概述 2D 写实数字人是通过计算机图形学…

Dockers部署oscarfonts/geoserver镜像的Geoserver

Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话&#xff0c;最后发现要选择合适的Geoserver镜像才是关键&#xff0c;所以所以所以…&#x1f437; 推荐oscarfonts/geoserver的镜像&#xff01; 一开始用kartoza/geoserver镜像一直提示内存不足&#xff0c;不过还好…

关于解决MySQL的常见问题

一&#xff1a;MySQL输入密码时闪退 这有可能是因为MySQL服务没有开启。 打开系统配置&#xff08;直接搜索即可&#xff09;&#xff0c;查看MySQL服务是否开启。 此时显示的是已停止。确定是这个问题。 现在打开计算机管理&#xff08;直接搜索即可&#xff09;。 找到MyS…

LeetCode 热题 100 101. 对称二叉树

LeetCode 热题 100 | 101. 对称二叉树 大家好&#xff0c;今天我们来解决一道经典的二叉树问题——对称二叉树。这道题在 LeetCode 上被标记为简单难度&#xff0c;要求检查给定的二叉树是否轴对称。 问题描述 给你一个二叉树的根节点 root&#xff0c;检查它是否轴对称。 示…

图形化编程革命:iVX携手AI 原生开发范式

一、技术核心&#xff1a;图形化编程的底层架构解析 1. 图形化开发的效率优势&#xff1a;代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例&#xff0c;Python 实现需定义函数、处理缩进并编写 …

uniapp跨平台开发HarmonyOS NEXT应用初体验

之前写过使用uniapp开发鸿蒙应用的教程&#xff0c;简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本&#xff0c;小一年过去了HbuilderX的正式版本已经来到4.64&#xff0c;历经了多个版本的更新后&#xff0c;跨平台开发鸿蒙应用的体验大幅提升。今天再…

windows怎么修改DNS

好的&#xff0c;在 Windows 操作系统中修改 DNS 设置有几种方法&#xff0c;最常用的是通过“网络和 Internet 设置”。以下是详细步骤&#xff1a; 方法一&#xff1a;通过设置应用修改 DNS (适用于 Windows 10/11) 打开设置&#xff1a; 点击屏幕左下角的 Windows 开始按钮…

Java基本数据类型缓存池解析-源码剖析

抛出问题&#xff1a;new Integer(18) 与 Integer.valueOf(18) 的区别是什么&#xff1f; new Integer(18) 每次都会新建一个对象;Integer.valueOf(18) 会使⽤用缓存池中的对象&#xff0c;多次调用只会取同⼀一个对象的引用 Integer x new Integer(18); Integer y new Int…

WORD压缩两个免费方法

日常办公和学习中&#xff0c;Word文档常常因为包含大量图片、图表或复杂格式而导致文件体积过大&#xff0c;带来诸多不便&#xff0c;比如 邮件发送受限&#xff1a;许多邮箱附件限制在10-25MB&#xff0c;大文件无法直接发送 存储空间占用&#xff1a;大量文档占用硬盘或云…

罗技无线鼠标的配对方法

罗技鼠标的配对方法&#xff1a; 重新连接鼠标 请按照以下步骤将鼠标与 USB 接收器重新配对。 1.将USB接收器插入计算机。 2.将鼠标关闭电源。 3.按住并持续按住向右按钮&#xff0c;直到操作结束。 4.切换鼠标电源。 5. 单击一次左侧按钮。 6. 单击一次中间按钮。 7.全部松开&…

四、Hadoop 2.X vs 3.X:特性、架构与性能全解析

Hadoop 2.X 与 Hadoop 3.X 深度对比&#xff1a;版本特性、架构与性能剖析 在大数据处理的浪潮中&#xff0c;Hadoop 凭借其分布式存储与计算的强大能力&#xff0c;成为了业界的核心框架之一。随着技术的不断演进&#xff0c;Hadoop 也经历了多个重要版本的迭代。其中&#x…

【React中useReducer钩子详解】

useReducer 是 React 中用于管理复杂状态逻辑的 Hook&#xff0c;它通过 集中式状态更新逻辑 替代 useState&#xff0c;尤其适合处理多值关联状态或依赖前序状态更新的场景。以下是其核心要点&#xff1a; 1. 核心概念 Reducer 模式&#xff1a;灵感来自 JavaScript 的 Array…

【C++】C++函数指针详解与实用技巧

C函数指针详解与实用技巧 在C中&#xff0c;**函数指针&#xff08;Function Pointer&#xff09;**是一种强大而灵活的工具&#xff0c;常用于回调机制、策略模式、事件处理等场景。本文将从概念、语法、常见用法到实战示例&#xff0c;带你全面掌握C函数指针。 &#x1f9e0…

【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析

基于深度学习的实时情绪检测系统&#xff1a;emotion-detection项目深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法1) 数据预处理流程2) 改进型MobileNetV2 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 数据集准备3.3 模型训练3.4 实时推理 4. 常见问题与解决方案4.…

IC ATE集成电路测试学习——电流测试的原理和方法

电流测试 我们可以通过电流来判断芯片的工作状态时&#xff0c;首先先了解下芯片的电流是如何产生的。 静态电流 理论上&#xff0c;CMOS结构的芯片静态时几乎不耗电 CMOS基本结构&#xff1a;Pmos Nmos 串联当逻辑电平稳定时&#xff1a; ➜ 要么Pmos导通&#xff0c;Nmo…

stm32week15

stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中断控制器&#xff0c;属于内核(M3/4/7) 中断向量表&#xff1a;定义一块固定的内存&#xff0c;以4字节对齐&#xff0c;存放各个中断服务函数程序的首地址&#xff0c;中断向量表定…

list类的详细讲解

【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…

第十节:图像处理基础-图像算术运算 (加法、减法、混合)

引言 在计算机视觉领域,图像算术运算是最基础却至关重要的核心技术。无论是实现简单的图片合成、开发智能监控系统,还是构建复杂的医学影像分析工具,加减运算和混合操作都扮演着关键角色。OpenCV作为最流行的计算机视觉库,提供了完善的图像处理函数集。本文将深入解析三种…

【React 的useState钩子详解】

React 的 useState 钩子详解 useState 是 React 中最基础且最常用的 Hook 之一&#xff0c;它允许你在函数组件中添加和管理状态。 基本语法 const [state, setState] useState(initialState);initialState: 状态的初始值&#xff0c;可以是任何 JavaScript 数据类型state:…