C++ Coding Exercise: Smallest Range of Array

  • 时间:2020-10-06 11:32:45
  • 分类:网络文摘
  • 阅读:129 次

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) —

推荐阅读:
先别想着做什么网站赚钱了 先做好网站建设吧  个人网站站长应了解的基础知识  作为个人站长,何不入驻今日头条  对个人站长的一些思考  一位个人站长的自白  2020疫情将过 个人站长能否有机会赚钱  这次疫情下对个人站长是机会吗?  站长赚钱需要做什么准备工作?  个人站长做个网站赚钱真是越来越难了  网站站长赚钱的七条经验分享 
评论列表
添加评论