【leetcode 详解】找出区分值(C++思路详解):这【中等】题怎么十分钟就写完了?

评价:就笔者的感觉吧,leetcode上难度标为“中等”的题目往往不是说需要什么高深的算法来解决,但基本都涉及到 “问题转化” 的能力要求,换言之,难点往往在于思维。

tip:要解决这类问题,笔者推荐多看看测试数据,观察他们的规律,多少能觅得一些启发。

        就今天这题而言,题目叙述只是提供了一个要求,并不是要你真的分成两个数组。

先说结论,其实要求出分度值的最小值,就是先对nums从小到大排序后,相邻两元素差的最小值

下面简单解释一下思路:

0. 首先很明确,任取nums中两个值作差的最小值minimu,一定小于等于根据题目需要(拆成两个数组...作差)返回的的值,

1. 那么就是看这个值minimu能否取到,

2. 进一步就是看,作差求出minimum的那两个数能否按题目要求放进两个数组的相应位置

3. 记排序后,作差求minimum的两个数为a, b

如下图所示,必然可以满足题目分成两数组要求

 你明白了吗~?

下面附上AC代码:

class Solution {
public:
    int findValueOfPartition(vector<int>& nums) {
    	sort(nums.begin(), nums.end());
    	int minimum = nums[1] - nums[0];
    	for(int i=2; i<nums.size(); i++)
    	{
			minimum = min(minimum, nums[i]-nums[i-1]);
		}
		return minimum;
    }
};

~希望对你有启发~

  • 44
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值