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

LeetCode——最小差值

文章目录

  • 最小差值 part1
  • 最小差值 part2


最小差值 part1

在这里插入图片描述

🍀思路:找到 nums 中最大值 max 和最小值 min,然后返回 (max - k) + (min + k) 即可。因为对于 nums 中的非最值 nums[ i ]:
在这里插入图片描述
🍀所以 nums 的最低分数为(max - k) + (min + k)。注意:如果(max - k) + (min + k)< 0,则返回 0

class Solution {
public:
	int smallestRangeI(vector<int>& nums, int k) {
		//找 nums 的最小值和最大值
		int min = 0, max = 0;
		for (int i = 1; i < nums.size(); i++) {
			if (nums[min] > nums[i]) {
				min = i;
			}
			if (nums[max] < nums[i]) {
				max = i;
			}
		}
		//返回 nums 的最小分数
		if (nums[max] - nums[min] < 2 * k) {
			return 0;
		}
		else return nums[max] - nums[min] - 2 * k;
	}
};

最小差值 part2

在这里插入图片描述

🍀分析:

  1. 对于 part1,我们可以通过调整 x 的值 [-k ~ k],使得数组中所有的值调整到 [min + k ~ max - k] 的区间范围。并且如果 max - min - 2 * k < 0,则我们可以调整到 max - x == min - x,使得 nums 的最小分数为 0

  2. 对于 part2,因为 k 为定值,所以我们我们不能对 max 和 min 进行一定的调整,所以此时 max - min - 2 * k 不一定是 nums 的最小分数,甚至 max - k 与 min + k 都不一定是 nums 进行加减 k 处理后的最值,即 max - min - 2 * k 都不一定是 nums 的分数

max - min - 2 * k > 0

在这里插入图片描述

max - min - 2 * k < 0

在这里插入图片描述

🍀思路:小的变大,大的变小(参考了 leetcoed 的最优回答),举个栗子:

令 k = 3,有一个 nums 数组如下:

在这里插入图片描述

将所有数全都加 k:

在这里插入图片描述

所以正确思路如下:

在这里插入图片描述

🍀算法实现步骤如下:

在这里插入图片描述

//版本一
   int smallestRangeII(vector<int>& nums, int k) {
        std::sort(nums.begin(),nums.end());
        int min = INT32_MAX,max = INT32_MIN;
        int res = INT32_MAX;
        //对 nums 进行 n 次调整
        for(int i =0; i < nums.size(); i++){
            int count = 0;
            min = INT32_MAX, max = INT32_MIN;
            //找到每一次调整后的 nums 的分数
            for(auto e : nums){
                if(i >= count){
                    if(e + k > max){
                        max = e + k;
                    }
                    if(e + k < min){
                        min = e + k;
                    }
                    count++;
                }
                else{
                    if(e - k > max){
                        max = e - k;
                    }
                    if(e - k < min){
                        min = e - k;
                    }
                    count++;
                }
            }
            //判断是不是最小分数
            res > (max - min) ? res = max - min : res;
        }
        return res;
    }

//版本二
int smallestRangeII(vector<int>& nums, int k) {
	std::sort(nums.begin(), nums.end());
	if (nums.size() == 1)return 0;
	int max = nums.back(), min = nums[0];
	int res = max - min;
	for (int i = 1; i < nums.size(); i++) {
		//找到调整后 nums 的最小值和最大值
		min = nums[i] - k > nums[0] + k ? nums[0] + k : nums[i] - k;
		max = nums[i - 1] + k > nums.back() - k ? nums[i - 1] + k : nums.back() - k;
		//判断是否为 nums 最小分数
		res = (res > (max - min) ? (max - min) : res);
	}
	return res;
}

本篇文章到这里就结束了,欢迎批评指正!


http://www.kler.cn/news/368698.html

相关文章:

  • c/c++--静态变量和静态函数(static)
  • 【React系列五】—React学习历程的分享
  • 《MYSQL 实战45讲》order by工作原理 10/27
  • Linux 重启命令全解析:深入理解与应用指南
  • Sentinel详解
  • JMeter实战之——模拟登录
  • RTMP视频推流EasyDSS平台重装服务器系统后无法启动是什么原因?
  • [LeetCode] 47. 全排列Ⅱ
  • 如何成为一个优秀的大数据开发工程师?
  • 基于SpringBoot的流浪动物管理系统设计与实现
  • Java面试题十三
  • 【Linux网络】Linux网络基础入门:初识网络,理解网络协议
  • 微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)
  • SQL Server 当前日期及其未来三天的日期
  • 【pytest中同一个用例多次执行生成一个测试报告的方法】
  • 学习FPGA需要掌握哪些语言
  • 线程支持库(C++11)
  • 【JavaEE初阶】网络原理-深入理解网络通信中协议的概念
  • 20241023软考架构-------软考案例5答案
  • 相关Coverage Path Planning的论文整理
  • C#的访问修饰符
  • Python基于TensorFlow实现简单循环神经网络分类模型(SimpleRNN分类算法)项目实战
  • Vue.js 学习总结(11)—— Vue3 Hook 函数实战总结
  • Dyna-Q 算法_笔记_20241023
  • 微信小程序-获取头像和昵称
  • CSS中的!important和空格选择器深入解析