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

D360周赛复盘:模拟(思维题目)⭐⭐+贪心解决可能的最小和(类似上次)

文章目录

    • 2833.距离原点最远的点
      • 思路
      • 完整版
    • 2834.找出美丽数组的最小和
      • 思路
      • 完整版

2833.距离原点最远的点

给你一个长度为 n 的字符串 moves ,该字符串仅由字符 'L''R''_' 组成。字符串表示你在一条原点为 0 的数轴上的若干次移动。

你的初始位置就在原点(0),第 i 次移动过程中,你可以根据对应字符选择移动方向:

  • 如果 moves[i] = 'L'moves[i] = '_' ,可以选择向左移动一个单位距离
  • 如果 moves[i] = 'R'moves[i] = '_' ,可以选择向右移动一个单位距离

移动 n 次之后,请你找出可以到达的距离原点 最远 的点,并返回 从原点到这一点的距离

示例 1:

输入:moves = "L_RL__R"
输出:3
解释:可以到达的距离原点 0 最远的点是 -3 ,移动的序列为 "LLRLLLR" 。

示例 2:

输入:moves = "_R__LL_"
输出:5
解释:可以到达的距离原点 0 最远的点是 -5 ,移动的序列为 "LRLLLLL" 。

示例 3:

输入:moves = "_______"
输出:7
解释:可以到达的距离原点 0 最远的点是 7 ,移动的序列为 "RRRRRRR" 。

提示:

  • 1 <= moves.length == n <= 50
  • moves 仅由字符 'L''R''_' 组成

思路

  • L_count > R_count 时,字符串中向左的移动比向右的多。而每个 _ 可以视为一个“自由移动”,它可以选择向左或向右移动。为了到达原点最远的距离,所有的 _都应该选择向左移动。所以,abs(L_count - R_count) + _count 就是最远的距离。

这个解法的核心思想是,为了达到最远的距离,应该尽可能地选择一个方向移动。

完整版

  • 因为需要移动n次,所有的移动字符都需要被遍历。因此,我们需要将L的总数与R的总数相减,再加上自由步数。
class Solution {
public:int furthestDistanceFromOrigin(string moves) {int L_count = count(moves.begin(),moves.end(),'L');int R_count = count(moves.begin(),moves.end(),'R');int _count = count(moves.begin(),moves.end(),'_');return abs(L_count-R_count)+_count;}
};

2834.找出美丽数组的最小和

给你两个正整数:ntarget

如果数组 nums 满足下述条件,则称其为 美丽数组

  • nums.length == n.
  • nums 由两两互不相同的正整数组成。
  • 在范围 [0, n-1] 内,不存在 两个 不同 下标 ij ,使得 nums[i] + nums[j] == target

返回符合条件的美丽数组所可能具备的 最小 和。

示例 1:

输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。
- nums 的长度为 n = 2 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 4 是符合条件的美丽数组所可能具备的最小和。

示例 2:

输入:n = 3, target = 3
输出:8
解释:
nums = [1,3,4] 是美丽数组。 
- nums 的长度为 n = 3 。 
- nums 由两两互不相同的正整数组成。 
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 8 是符合条件的美丽数组所可能具备的最小和。

示例 3:

输入:n = 1, target = 1
输出:1
解释:nums = [1] 是美丽数组。

提示:

  • 1 <= n <= 105
  • 1 <= target <= 105

思路

本题就和上次周赛的贪心很像了,求得也是可能的最小和,所以需要从最小的数字开始取!

完整版

和上次周赛代码基本相同,求的都是可能的最小和问题。

class Solution {
public:long long minimumPossibleSum(int n, int target) {set<long long>used;int cur = 1;long long sum=0;for(int i=1;i<=n;i++){while(used.count(cur)||used.count(target-cur)){cur++;}used.insert(cur);sum+=cur;}return sum;}
};
http://www.lryc.cn/news/149577.html

相关文章:

  • 【C++学习】函数指针
  • A. Copil Copac Draws Trees
  • D359周赛复盘:贪心解决求最小和问题⭐⭐+较为复杂的双层线性DP⭐⭐
  • python基础之miniConda管理器
  • C++算法 —— 分治(1)快排
  • 接口用例设计
  • Selenium超级详细的教程
  • 服务报network error错误
  • 【ES6】利用 Proxy实现函数名链式效果
  • hive部署
  • ip白名单之网段
  • PMP项目管理主要学习内容是什么?
  • 小米面试题——不用加减乘除计算两数之和
  • Mysql 日志管理 数据备份
  • Java小记-腾讯2020校招-后台-逛街
  • FFmpeg5.0源码阅读——FFmpeg大体框架
  • 【算法刷题之字符串篇】
  • js中forEach和map的区别:forEach不会改变原数组,而map会改变数组?错了错了
  • 深度对话:从底层看Sui设计理念及网络规模扩展
  • 2.单链表练习
  • Wordpress 安装插件和主题报错
  • Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡
  • CSS中如何隐藏元素但保留其占位空间(display:none vs visibility:hidden)?
  • 无涯教程-机器学习 - 数据可视化
  • springboot设置日志输出级别
  • buildAdmin的使用笔记
  • RealVNC配置自定义分辨率(AlmaLinux 8)
  • LA@特征值和特征向量的性质
  • Springboot使用kafka事务-生产者方
  • 您的计算机已被.halo勒索病毒感染?恢复您的数据的方法在这里!