很有意思的一道数学推理题目, 剪枝以后解法也很简洁。
初看貌似需要把每个数跟其他数作比较。但排序以后可以发现情况大大简化:
对于任一对元素a[i] < a[j], a[i] - k和a[j] + k 的情况可以排除, 因为会产生比原值更大的差, 所以对于原有数组的最小值min最大值max, (min - k, max + k)的情况可以排除。剩下的三种情况, (min - k, max - k), (min + k, max + k) 和 (min + k, max - k),后两种等价于原值max - min, 我们可以把初始最大差值设为max - min, 确保最终结果不会比这个平凡值更坏。
对于最后一种情况(min + k, max - k), 需要继续分情况讨论。
方便起见,我们可以把所有元素都预先-k, 然后从最小元素开始,尝试依次把各元素+2*k.
我们可以证明,如果选择a[i] + 2 * k,那么之前任一元素a[j] (0 <= j < i)加上 2 * k,都不会使结果更坏。证明见此:
B = [A[0] + 2K, ...,A[i-1]+2K, A[i] + 0, A[i+1] +2K, ..., A[j]+2K, ..., A[j+1]+0, A[n-1]+0]
B' = [A[0] + 2K, ...,A[i-1]+2K, A[i] + 2K, A[i+1] +2K, ..., A[j]+2K, ..., A[j+1]+0, A[n-1]+0]
A[i]+2K is between A[i-1] + 2K and A[i+1] +2K, so it must stand in the range of B.
B' is not worse than B, it can be easily generalized to multiple elements added by 0 between the ones added by 2K.
于是当我们考虑a[i] + 2 * k时,可以假设之前的元素都已经加上了2 * k。
当前最大差值取决于:
1) 当前数列最小值:
可能为a[i+1]
a[i+1],...a[0]+2*k...a[n-1]...
或a[0]+2*k
a[0]+2*k..., a[i+1],...a[n-1]...
2) 以及当前数列最大值:
可能为a[i]+2*k
...a[n-1]...a[i]+2*k
或者a[n-1]
...a[i]+2*k...a[n-1]

因此我们只需遍历所有元素,计算当前元素加上2*k的以后的数组的最大差值,取其中的最小值即可。

public:int smallestRangeII(vector<int>& a, int k) {size_t len = a.size();if(len <= 1) return 0;sort(a.begin(), a.end());int front = a.front(), back = a.back(), d = back - front, start = front + 2 * k;if( k >= d) return d;int ans = d;for(size_t i = 0; i < len - 1; i++){int lo = min(start, a[i + 1]), hi = max(a[i] + 2 * k, back);ans = min(ans, hi - lo);}return ans;}

参考:https://zhanghuimeng.github.io/post/leetcode-910-smallest-range-ii/

转载于:https://www.cnblogs.com/k330/p/LeetCode_910_Smallest_Range_II.html

LeetCode 910. Smallest Range II相关推荐

  1. 【leetcode】910. Smallest Range II

    题目如下: 解题思路:我的思路是先找出最大值.对于数组中任意一个元素A[i]来说,如果A[i] + K 是B中的最大值,那么意味着从A[i+1]开始的元素都要减去K,即如果有A[i] + K > ...

  2. leetcode 45. 跳跃游戏 II 46. 全排列

    leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...

  3. Leetcode - Subsets I,II

    Leetcode - 078. Subsets 这道题重定义了什么叫可行解: 一般而言,可行解需要满足强约束性条件集,而本题的可行解就是单一弱约束性条件(distinct integers,只需要当前 ...

  4. Leetcode - Permutations I,II

    Leetcode - 046 Permutations 全排列问题是回溯的典型例题: 1.可行解的组成形式是给定数组中的所有数的组合,故而大小上可以作为可行解判定条件 2.每次需要在剩下可被选中的集合 ...

  5. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  6. 【DFS + 记忆化递归】LeetCode 140. Word Break II

    LeetCode 140. Word Break II Solution1:我的答案 纯DFS,在第31个case时超时,还是记录一下.. class Solution { // DFS public ...

  7. 【重点!DP】LeetCode 639. Decode Ways II

    LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...

  8. 【DFS + Backtracking】LeetCode 212. Word Search II

    LeetCode 212. Word Search II Solution1:我的答案 暴力搜索..基于第79题的答案,真的是非常之慢啊!!! 快的方法均是基于字典树的方法,真是复杂.. class ...

  9. 【动态规划】LeetCode 63. Unique Paths II

    LeetCode 63. Unique Paths II Solution1:我的答案 在哪里做过这题? class Solution { public:int uniquePathsWithObst ...

最新文章

  1. oracle 复制 mysql_MySQL与Oracle之间互相拷贝数据的Java程序
  2. MySQL中的CURRENT_TIMESTAMP
  3. Hadoop 分布式集群搭建步骤
  4. 阿里云 x 蒙牛 | 打通数据孤岛,基于MaxCompute实现产销协同的智慧运营
  5. 学习Java之前先学C语言
  6. 【Essay】开始研究生小论文的撰写
  7. c语言检验xml文档是否正确_带饰面砖的预制构件进场复验时,每600m2为一个检验批是否正确?...
  8. 辗转相减法的发展应用-最大比例
  9. Win8.1下COCOS2D-X 3.4环境搭建
  10. 加密-网络安全之1号皇帝新衣
  11. 安装sql2000提示html,安装sql2000数据库提示:command line option syntax error
  12. 某大学校园网设计方案大学校园拓扑图 全解
  13. 什么是物联网技术
  14. python 函数嵌套和嵌套调用
  15. ]计算机专业就业方向 .
  16. 树莓派Pico与ADXL345三轴加速度传感器SPI总线接口技术及MicroPython编程
  17. 【python】字符串前加u,r,b,f的含义
  18. 解决win10点击开始按钮无反应
  19. Android系统(168)---Android 开源项目分类汇总
  20. 可视化大屏项目-大屏界面测试点梳理

热门文章

  1. jtessboxeditorfx 界面显示不出来_华为Mate40 Pro开箱简评,有点不开心
  2. hp-ux mysql_HP-UX 安装MySQL
  3. FluidSynth(实时MIDI合成器)
  4. 简单公司主页HTML5模板
  5. 小度智能音响拆解 芯片_打磨小度智能音箱:深度拆解,发掘升级潜能
  6. RIPRO主题美化-首页全屏动态幻灯片美化模块 WordPress主题美化
  7. emlog独立会员中心模板源码 UserEmlog Ver:1.0
  8. 大刚二开emlog模板超级帅-全版本兼容-修复各种bug
  9. Java开发必会MVC三层架构
  10. Linux环境Elasticsearch6.xxx 之kibana可视化工具操作索引