C++ Coding Exercise: Smallest Range of Array
- 时间:2020-10-06 11:32:45
- 分类:网络文摘
- 阅读:146 次
Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and add x to A[i]. After this process, we have some array B.
Return the smallest possible difference between the maximum value of B and the minimum value of B.
Example 1:
Input: A = [1], K = 0
Output: 0
Explanation: B = [1]Example 2:
Input: A = [0,10], K = 2
Output: 6
Explanation: B = [2,8]Example 3:
Input: A = [1,3,6], K = 3
Output: 0
Explanation: B = [3,3,3] or B = [4,4,4]Note:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
We need to find out the max and min number of the array first using O(N) approach – e.g. using std::accumulate method to do this in one line.
Then, the smallest range must be the difference between the max-k, and min+k, if the min+k is bigger than max-k, the difference of the smallest range is zero because we can always choose a number that is smaller than K to make the difference zero (greedy algorithm).
1 2 3 4 5 6 7 8 | class Solution { public: int smallestRangeI(vector<int> & A, int K) { int _max = std::accumulate(begin(A), end(A), A[0], [](auto &a, auto &b) { return max(a, b); }); int _min = std::accumulate(begin(A), end(A), A[0], [](auto &a, auto &b) { return min(a, b); }); return max(0, _max - K - (_min + K)); } }; |
class Solution {
public:
int smallestRangeI(vector<int> & A, int K) {
int _max = std::accumulate(begin(A), end(A), A[0], [](auto &a, auto &b) { return max(a, b); });
int _min = std::accumulate(begin(A), end(A), A[0], [](auto &a, auto &b) { return min(a, b); });
return max(0, _max - K - (_min + K));
}
};The above C++ approach takes O(N) time, and O(1) space.
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:小玲和小聪收集各种卡片 三种水果共有多少千克 汽车比原计划早到1.5小时到达目的地 果园里有桔子树和梨树共360棵 原来定价时所期望的利润是多少元? 男生人数的40%比女生人数的一半还多3人 某工厂一、二车间共360人 将侧面积是94.2平方厘米的圆柱拼成一个近似的长方体 公交车共有多少张座位? 新华书店运来书600本
- 评论列表
-
- 添加评论