【刷题笔记】第一天

两道贪心题

文章目录

      • [3106. 满足距离约束且字典序最小的字符串](https://leetcode.cn/problems/lexicographically-smallest-string-after-operations-with-constraint/)
      • [3107. 使数组中位数等于 K 的最少操作数](https://leetcode.cn/problems/minimum-operations-to-make-median-of-array-equal-to-k/)

3106. 满足距离约束且字典序最小的字符串

字典序:abcd顺序,其中z和a的差值是1。

distance(s, t)表示对应位置字符的ASCLL差的累加。

例如distance(“ab”, “cd”) == 4 (c - a + d - b )

当k等于0时,表示s和t完全一样

当k等于1时,表示只有s[i] != t[i],且s[i] - t[i] == 1

所以相当于求对字符串s操作k次,每次k减一,字符移动一位,最小字典项的字符串是什么。
尽量使得每一个位置的字符为a

class Solution {
    public String getSmallestString(String s, int k) {
        // 要求字典序最小,肯定是从前往后调整
        char[] chs = s.toCharArray();
        for (int i = 0; i < chs.length; ++i) {
            char c = chs[i];
            int dis = Math.min(c - 'a', 'z' + 1 - c);
            if (dis > k) {
                // 当c距离a的最小距离超过k时,直接令c往前跳k步,为什么不是往后跳呢?
				// 因为两者的最小值都大于k了,往后跳肯定跳不到a
                chs[i] = (char)(chs[i] - k); // 往前跳是为了保证字典项最小
                break;
            }
            k -= dis;
            chs[i] = 'a';
        }
        return new String(chs);

    }
}

3107. 使数组中位数等于 K 的最少操作数

中位数小于K

image-20240410110804339

中位数大于K

image-20240410110858860

class Solution {
    public long minOperationsToMakeMedianK(int[] nums, int k) {
        int mid = nums.length / 2;
        Arrays.sort(nums); 
        long ans = 0;
        if (nums[mid] > k) { // nums[mid]表示当前数组的中位数
            // 将中间左边的位置置为小于等于k
            // 为什么不需要管中间右边的元素呢,因为右边的元素一定大于等于k
            // 为什么只需要设置为k呢,因为题目要求操作次数最小
            for (int i = mid; i >= 0; i--) {
                if (nums[i] <= k) break;
                ans += nums[i] - k;
            }
        } else if (nums[mid] < k) {
            // 将中间右边的元素置为大于等于k
            for (int i = mid; i < nums.length; ++i) {
                if (nums[i] >= k) break;
                ans += k - nums[i];
            }
        }
        return ans;

    }
}

思考:改成输入 $10^5 $个询问,每个询问包含一个 k k k,如何高效地回答每个询问?

首先也是先排序,然后判断中位数是否大于k

如果中位数大于k:就二分找到第一个大于k的位置,假设是i,从i位置到mid位置所有元素都变为k,所需要的操作次数= sum[mid] - sum[i - 1] - (mid - i + 1) * k,其中sum是前缀和数组。

class Solution {
 public long minOperationsToMakeMedianK(int[] nums, int k) {
     int mid = nums.length / 2;
     Arrays.sort(nums);
     long ans = 0;
     long[] sum = new long[nums.length];
     sum[0] = nums[0];
     for (int i = 1; i < nums.length; ++i) {
         sum[i] = sum[i - 1] + nums[i];
     }
     if (nums[mid] > k) {

         // 将中间左边的位置置为小于等于k
         // 为什么不需要管中间右边的元素呢,因为右边的元素一定大于等于k
         // 为什么只需要设置为k呢,因为操作次数最小
         int l = 0, r = nums.length - 1;
         while (l < r) {
             int m = l + r >> 1;
             if (nums[m] > k) {
                 r = m;
             } else {
                 l = m + 1;
             }
         }
         if (l <= mid) {
             if (l == 0) {
                 ans += sum[mid] - ((long)mid - l + 1) * k;
             } else {
                 ans += sum[mid] - sum[l - 1] - ((long)mid - l + 1) * k;
             }

         }
     } else if (nums[mid] < k) {
         // 将中间右边的元素置为大于等于k
         int l = 0, r = nums.length - 1;
         while (l < r) {
             int m = l + r + 1 >> 1;
             if (nums[m] < k) {
                 l = m;
             } else {
                 r = m - 1;
             }
         }

         if (l >= mid) {
             if (mid == 0) {
                 // l - mid + 1) * k可能会溢出,所以要强转为long
                 ans += ((long)l - mid + 1) * k - sum[l];
             } else {
                 ans += ((long)l - mid + 1) * k - (sum[l] - sum[mid - 1]);
             }
         } 
     }
     return ans;
 }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装python3.10

1. 官网下载源程序 2. 解压进入文件夹&#xff1a; ./configure --prefix/usr/local/python3/ 3. 编译安装&#xff1a; make && make install 4. 添加环境变量&#xff1a; vim ~/.bashrc PATH/usr/local/python3/bin:$PATH #保存后&#xff0c;刷新配置文件 sour…

HCIP的学习(8)

OSPF数据报文 OSPF头部信息&#xff08;公共固定&#xff09; 版本&#xff1a;OSPF版本&#xff0c;在IPv4网络中版本字段恒定为数值2&#xff08;v1属于实验室版本&#xff0c;v3属于IPv6&#xff09;类型&#xff1a;代表具体是哪一种报文&#xff0c;按照1~5排序&#xff…

C++从入门到精通——类的6个默认成员函数之赋值运算符重载

赋值运算符重载 前言一、运算符重载定义实例注意要点 二、赋值运算符重载赋值运算符重载格式赋值运算符重载要点重载要点传值返回和传址返回要点 三、前置和后置重载 前言 类的6个默认成员函数&#xff1a;如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么…

xcode c++项目设置运行时参数

在 Xcode 项目中&#xff0c;你可以通过配置 scheme 来指定在运行时传递的参数。以下是在 Xcode 中设置运行时参数的步骤&#xff1a; 打开 Xcode&#xff0c;并打开你的项目。在 Xcode 菜单栏中&#xff0c;选择 "Product" -> "Scheme" -> "E…

利驰软件亮相第二届全国先进技术成果转化大会

4月8日&#xff0c;第二届全国先进技术成果转化大会在苏开幕。省长许昆林出席大会开幕式并致辞。国家国防科工局局长张克俭&#xff0c;省委常委、苏州市委书记刘小涛分别致辞。 本次转化大会由江苏省国防科学技术工业办公室、苏州市人民政府、先进技术成果长三角转化中心主办…

无人棋牌室软硬件方案

先决思考 软件这一套确实是做一套下来&#xff0c;可以无限复制卖出&#xff0c;这个雀氏是一本万利的买卖。 现在肯定是有成套的方案&#xff0c;值不值得重做&#xff1f;为什么要重做&#xff1f; 你想达到什么效果&#xff1f;还是需要细聊的。 做这个东西难度不高&…

自动发版工具以及本地debug

# 定义变量 $jarFile "xxx.jar" $server "ip" $username "user" $password "password" $remoteHost "${username}${server}" $remoteFolderPath "path" $gitDir "$PSScriptRoot\..\.git" # 设置…

每日OJ题_BFS解决最短路①_力扣1926. 迷宫中离入口最近的出口

目录 力扣1926. 迷宫中离入口最近的出口 解析代码 力扣1926. 迷宫中离入口最近的出口 1926. 迷宫中离入口最近的出口 难度 中等 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&…

汽车抗疲劳驾驶测试铸铁试验底座技术要求有哪些

铸铁平台试验台底座的主要技术参数要求 1、 试验台底座设计制造符合JB/T794-1999《铸铁平板》标准。 2、 试验铁底板及所有附件的计量单位全部采用 单位&#xff08;SI&#xff09;标准。 3、铸铁平台平板材质&#xff1a;用细密的灰口铸铁HT250或HT200&#xff0c;强度符…

默认图表太丑!?快来看看这个好看的绘图主题吧~~

有很多小伙伴经常私信给小编&#xff0c;问自己绘制的图表为啥没小编绘制的精美&#xff1f; 听到这句话&#xff0c;小编老脸一红&#xff0c;还是比较惭愧的&#xff0c;因为并不是像小伙伴说的那样对每一个图表元素都进行定制化涉及操作&#xff0c;是借助优秀的“第三方工具…

Python 正则表达式模块使用

目录 1、匹配单个字符 2、匹配多个字符 3、匹配开头结尾 4、匹配分组 说明&#xff1a;在Python中需要通过正则表达式对字符串进行匹配的时候&#xff0c;可以使用re模块 表达式&#xff1a;re.match(正则表达式&#xff0c; 要匹配的字符串) 有返回值说明匹配成功&#x…

vue3项目 使用 element-plus 中 el-collapse 折叠面板

最近接触拉了一个项目&#xff0c;使用到 element-plus 中 el-collapse 折叠面板&#xff0c;发现在使用中利用高官网多多少少的会出现问题。 &#xff08;1.直接默认一个展开值&#xff0c;发现时显时不显 2 . 数据渲染问题&#xff0c;接口请求了&#xff0c;页面数据不更新 …

通过Omnet++官网tictoc教程学习在Omnet++中构建和运行仿真 Part3

TicToc Part3 增强2节点 TicToc增加图标增加 日志添加状态变量增加参数使用NED 继承模拟处理延时随机数字和参数超时、取消计时器重传同样的消息 官方文档 在官方文档中&#xff0c;你可以看见所有的代码 增强2节点 TicToc 增加图标 为了使模型在GUI中看起来更好看&#xff…

计算机网络—TCP协议详解:协议构成、深度解析(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

vs2008使用 openmp

目录 1 在项目中找到property pages>>c/c>>language>>openmp支持 2 在环境变量中增加“OMP_NUM_THREADS”变量&#xff0c;数值自己根据你的CPU的性能来设置&#xff0c;一般2、4、8等 3 在项目中输入如下代码&#xff0c;并编译运行 4 结果与不使用omp的…

浅谈Java IO流

Java中的IO流&#xff08;Input/Output streams&#xff09;是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念&#xff0c;允许Java程序与外部世界进行数据交换&#xff0c;无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照…

RAG 如何消除大模型幻觉

什么是大模型幻觉 假设我们有一个基于大型生成模型&#xff08;如GPT-3&#xff09;的问答系统&#xff0c;该系统用于回答药企内部知识库中的问题。我们向其提出一个问题&#xff1a;“阿司匹林的主要药理作用是什么&#xff1f;” 正确的答案应该是&#xff1a;“阿司匹林主…

Qt 的内存管理机制

目录 Qt 的内存管理机制 Qt 的对象树 利用代码查看自动释放 Qt 的内存管理机制 Qt 的对象树 Qt 中所有的控件都是被一颗多叉树管理起来的&#xff0c;这样就是为了方便释放资源的时候方便释放&#xff0c;而我们在编写代码的时候&#xff0c;创建对应的控件&#xff0c;然…

Samtec科普 | 一文入门连接器电镀的QA

【摘要/前言】 像大多数电子元件一样&#xff0c;无数子元件和工艺的质量直接影响到成品的质量和性能。对于PCB级连接器&#xff0c;这些因素包括针脚材料、塑料类型、模制塑料体的质量、尾部的共面性、表面处理&#xff08;电镀&#xff09;的质量、选择正确的连接器电镀、制…

【C++算法模板】数论:欧拉筛,线性查找质数的算法

文章目录 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09;2&#xff09;欧拉筛 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09; bool isPrime(int num) {for(int i2;i<sqrt(num)) {if(num%i0)return false;}return true; }如果要…