Skip to content

Latest commit

 

History

History

2554

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

You are given an integer array banned and two integers n and maxSum. You are choosing some number of integers following the below rules:

  • The chosen integers have to be in the range [1, n].
  • Each integer can be chosen at most once.
  • The chosen integers should not be in the array banned.
  • The sum of the chosen integers should not exceed maxSum.

Return the maximum number of integers you can choose following the mentioned rules.

 

Example 1:

Input: banned = [1,6,5], n = 5, maxSum = 6
Output: 2
Explanation: You can choose the integers 2 and 4.
2 and 4 are from the range [1, 5], both did not appear in banned, and their sum is 6, which did not exceed maxSum.

Example 2:

Input: banned = [1,2,3,4,5,6,7], n = 8, maxSum = 1
Output: 0
Explanation: You cannot choose any integer while following the mentioned conditions.

Example 3:

Input: banned = [11], n = 7, maxSum = 50
Output: 7
Explanation: You can choose the integers 1, 2, 3, 4, 5, 6, and 7.
They are from the range [1, 7], all did not appear in banned, and their sum is 28, which did not exceed maxSum.

 

Constraints:

  • 1 <= banned.length <= 104
  • 1 <= banned[i], n <= 104
  • 1 <= maxSum <= 109

Companies: PayPal

Related Topics:
Array, Hash Table, Binary Search, Greedy, Sorting

Similar Questions:

Hints:

  • Keep the banned numbers that are less than n in a set.
  • Loop over the numbers from 1 to n and if the number is not banned, use it.
  • Keep adding numbers while they are not banned, and their sum is less than k.

Solution 1.

// OJ: https://leetcode.com/problems/maximum-number-of-integers-to-choose-from-a-range-i
// Author: github.com/lzl124631x
// Time: O(BlogB + N)
// Space: O(1)
class Solution {
public:
    int maxCount(vector<int>& banned, int n, int maxSum) {
        sort(begin(banned), end(banned));
        long long ans = 0, sum = 0, i = 0, N = banned.size();
        for (int j = 1; j <= n; ++j) {
            if (i < N && banned[i] == j) {
                while (i < N && banned[i] == j) ++i;
            } else if (sum + j <= maxSum) {
                sum += j;
                ++ans;
            } else break;
        }
        return ans;
    }
};