当前位置: 首页 > news >正文

力扣9.25

2306. 公司命名

给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下:

ideas 中选择 2 个 不同 名字,称为 ideaAideaB
交换 ideaAideaB 的首字母。
如果得到的两个新名字 都 不在ideas 中,那么 ideaA ideaB(串联 ideaA 和 ideaB ,中间用一个空格分隔)是一个有效的公司名字。
否则,不是一个有效的名字。
返回 不同 且有效的公司名字的数目。

数据范围

  • 2 <= ideas.length <= 5 * 104
  • 1 <= ideas[i].length <= 10
  • ideas[i] 由小写英文字母组成
  • ideas 中的所有字符串 互不相同

分析

将字母按开头分类,放入 v e c t o r vector vector中,预处理每个开头对应的集合中的单词在和后面的字母交换首字母后仍然合法的单词的数量,放在 c n t [ i ] [ j ] cnt[i][j] cnt[i][j]中( c n t [ i ] [ j ] cnt[i][j] cnt[i][j]表示以 i i i开头的单词集中若和字符j交换首字母后仍然合法的单词数目),外层循环遍历所有的单词,内存循环遍历字母序比当前单词首字母小的字母,若能交换,则 r e s res res加上 c n t cnt cnt对应的值。

代码

typedef long long LL;
class Solution {
public:const static int N = 35, M = 5e4 + 5;// unordered_map<string, bool> vis;unordered_set<string> st;int cnt[N][N];vector<string> idea[N];long long distinctNames(vector<string>& ideas) {for(auto v : ideas) {// vis[v] = true;st.insert(v);idea[v[0] - 'a'].push_back(v);}for(int i = 'a' - 'a'; i <= 'z' - 'a'; i ++ ) {for(int j = 'a'; j <= 'z'; j ++ ) {for(auto k : idea[i]) {string ts = k;ts[0] = j;// if(!vis[ts]) cnt[i][j - 'a'] ++ ;if(!st.count(ts)) cnt[i][j - 'a'] ++ ;}}}LL res = 0;for(int i = 'a' - 'a'; i <= 'z' - 'a'; i ++ ) {for(auto s : idea[i]) {for(int j = 0; j < i; j ++ ) {string ts = s;ts[0] = char(j + 'a');if(st.count(ts)) continue;res += cnt[j][i];}}}return res * 2;}
};

740. 删除并获得点数

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

数据范围

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] <= 104

分析

将每个数字出现的个数用cnt数组记录,令dp[i][0]表示不删除值为i的数获得点数最大值,dp[i][1]表示删除值为i的数获得点数最大值,状态转移如下

  • d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] ) dp[i][0]=max(dp[i-1][1],dp[i-1][0]) dp[i][0]=max(dp[i1][1],dp[i1][0])
  • d p [ i ] [ 1 ] = d p [ i − 1 ] [ 0 ] + c n t [ i ] ∗ i dp[i][1]=dp[i-1][0]+cnt[i]*i dp[i][1]=dp[i1][0]+cnt[i]i

代码

class Solution {
public:const static int N = 1e4 + 5;int cnt[N];int dp[N][2];int n;int deleteAndEarn(vector<int>& nums) {n = nums.size();for(int i = 0; i < n; i ++ ) cnt[nums[i]] ++ ;for(int i = 1; i <= N - 5; i ++ ) {dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);dp[i][1] = dp[i - 1][0] + cnt[i] * i;}int res = 0;for(int i = 0; i <= N - 5; i ++ ) {res = max(res, dp[i][0]);res = max(res, dp[i][1]);}return res;}
};

120. 三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

数据范围

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104

分析

简单DP,注意在边界的情况

代码

class Solution {
public:const static int N = 205;int dp[N][N];int minimumTotal(vector<vector<int>>& triangle) {int n = triangle.size();for(int i = 0; i < n; i ++ ) {for(int j = 0; j <= i; j ++ ) {if(j == 0) dp[i + 1][j + 1] = dp[i][j  + 1] + triangle[i][j]; else if(j == i) dp[i + 1][j + 1] = dp[i][j] + triangle[i][j]; else dp[i + 1][j + 1] = min(dp[i][j + 1], dp[i][j]) + triangle[i][j];}}int res = 0x3f3f3f3f;for(int i = 0; i < n; i ++ ) res = min(res, dp[n][i + 1]);return res;}
};

相关文章:

  • 51单片机如何判断浮点数nan
  • QT 如何判断电脑已安装某个软件
  • 知识点复习4
  • 漫步者头戴式耳机好用吗?漫步者、西圣、万魔顶级机型测评对比
  • (23)mysql中mysqldump备份数据库
  • java SE -- 线程 asset
  • 基于yolov8的游戏人物自动锁定功能
  • 排序--堆排序【图文详解】
  • Vert.x 和 Spring Boot 是两种流行的 Java 框架的比较
  • Java AI 编程助手
  • 探索图像生成大模型Imagen:原理、比较与应用
  • Nginx的核心架构和设计原理
  • 大语言模型技术点总结
  • 二、词法分析,《编译原理》(本科教学版),第2版
  • 【C#】内存的使用和释放
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【译】理解JavaScript:new 关键字
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android组件 - 收藏集 - 掘金
  • conda常用的命令
  • css属性的继承、初识值、计算值、当前值、应用值
  • js算法-归并排序(merge_sort)
  • LintCode 31. partitionArray 数组划分
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • - 概述 - 《设计模式(极简c++版)》
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 回顾 Swift 多平台移植进度 #2
  • 人脸识别最新开发经验demo
  • 什么软件可以剪辑音乐?
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​​​【收录 Hello 算法】9.4 小结
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #数据结构 笔记三
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)linux使用docker容器运行mysql
  • (十八)Flink CEP 详解
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)stm32之通信协议
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .describe() python_Python-Win32com-Excel
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core中的时区转换问题
  • .Net 垃圾回收机制原理(二)
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .Net7 环境安装配置