2057. 值相等的最小索引
int smallestEqual(int* nums, int numsSize){
int i;
for(i=0;i < numsSize ;++i)
{
if( i % 10 == nums[i] ) return i;
}
return -1;
}
2064.分配给商店的最多商品 的最小值
思路:
“我希望 x 越小越好, 即 我 想 最小化 分配给任意商店商品数目的 最大值”
对于第 i 种商品数量为 quantities[i] ,可以分配给的 最小的商店数目 就是 quantities[i] / x 的上整。(若我有7个商品,每个商店最多数量为3,则分配最小的商店数目是3)。
在算出x的情况下,若满足 x 小于等于 n ,则说明在取 x 作为最大值的时候,商品能够分完 , 即为解
假若 x 合法,那么 x + 1 也合法(假设x正无穷大)
一般地, 给定分配商品数目的最大值x,所分配的商店数目为f,那么随着x的增大,f必定减小(严格来说是非增),即f与x存在单调关系。这个时候,单调性的出现就暗示了需要采用
【 二分查找 】
(一般看见什么 最小化的最大化 之类的 优先思考二分查找)
class Solution { public: int check(vector<int>& q, int m, int x) { int res = 0; for (int i = 0; i < m; ++i) { res += (q[i] % x == 0 ? q[i] / x : (q[i] / x + 1)); } return res; } int minimizedMaximum(int n, vector<int>& quantities) { int res = 0; sort(begin(quantities), end(quantities)); int m = quantities.size(); int left = 1; // 左边界可以取到,这里应该是一个可能的目标值 int right = quantities[m - 1] + 1; // 由于终止条件为left < right,即右侧取不到,那么初始值right应该是一个比可能的目标值大的值; int mid = 0; cout << check(quantities, m, 12) <<endl; while (left < right) { mid = left + (right - left) / 2; if (check(quantities, m, mid) > n) { // 左边界不取等号,所以更新时+1; left = mid + 1; } else { // 可以取等号,所以更新值=mid right = mid; } } return left; } };
//英雄哥的C语言版本 bool check(int n, int* q, int m, int x) { int i; int ans = 0; for(i = 0; i < m; ++i) { ans += (q[i] + x - 1) / x; if(ans > n) { return false; } } return true; } int minimizedMaximum(int n, int* quantities, int quantitiesSize){ int l = 1, r = 100000; int mid, x; while(l <= r) { mid = (l + r) / 2; if(check(n, quantities, quantitiesSize, mid)) { x = mid; r = mid - 1; }else { l = mid + 1; } } return x; }