num이라는 숫자 목록과 다른 값 k가 있다고 가정합니다. nums의 일부 하위 집합을 사용하여 [1, k]에서 임의의 수를 만들 수 있도록 nums에 삽입해야 하는 최소 수의 수를 찾아야 합니다.
따라서 입력이 nums =[3, 5], k =6과 같으면 출력은 2가 됩니다. 1, 2를 삽입해야 하므로 다음을 만들 수 있습니다. 1 =[1], 2 =[2 ], 3 =[3], 4 =[1, 3], 5 =[5], 6 =[1, 5].
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 배열 번호 정렬
- sum :=0, 다음 :=1, ret :=0
- 숫자에 있는 모든 i에 대해
- 다음에
- 합계>=k인 경우:
- 루프에서 나오다
- 합계 :=합 + 다음
- 다음 :=합계 + 1
- (ret 1 증가)
- 합계>=k인 경우:
- 다음에
- 합계>=k인 경우:
- 루프에서 나오다
- 합계 :=합 + i
- 다음 :=합계 + 1
- 합계 :=합 + 다음
- 다음 :=합계 + 1
- (ret 1 증가)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#include using namespace std; class Solution { public: int solve(vector& nums, int k) { sort(nums.begin(), nums.end()); int sum = 0; int next = 1; int ret = 0; for (int i : nums) { while (next < i) { if (sum >= k) break; sum += next; next = sum + 1; ret++; } if (sum >= k) break; sum += i; next = sum + 1; } while (next <= k) { sum += next; next = sum + 1; ret++; } return ret; } }; int solve(vector& nums, int k) { return (new Solution())->solve(nums, k); } int main(){ vector v = {3, 5}; int k = 6; cout << solve(v, k); }
입력
[3, 5], 6
출력
2