给你一个长度为 n
的数组 apple
和另一个长度为 m
的数组 capacity
。
一共有 n
个包裹,其中第 i
个包裹中装着 apple[i]
个苹果。同时,还有 m
个箱子,第 i
个箱子的容量为 capacity[i]
个苹果。
请你选择一些箱子来将这 n
个包裹中的苹果重新分装到箱子中,返回你需要选择的箱子的 最小 数量。
注意,同一个包裹中的苹果可以分装到不同的箱子中。
示例 1:
输入:apple = [1,3,2], capacity = [4,3,1,5,2] 输出:2 解释:使用容量为 4 和 5 的箱子。 总容量大于或等于苹果的总数,所以可以完成重新分装。
class Solution {
public int minimumBoxes(int[] apple, int[] capacity) {
int count = 0;
for (int i : apple) {
count += i;
}
Arrays.sort(capacity);
int j = capacity.length - 1;
for (; j >= 0 && count > 0; j--) {
count -= capacity[j];
}
return capacity.length - j - 1;
}
}
给你一个长度为 n
的数组 happiness
,以及一个 正整数 k
。
n
个孩子站成一队,其中第 i
个孩子的 幸福值 是 happiness[i]
。你计划组织 k
轮筛选从这 n
个孩子中选出 k
个孩子。
在每一轮选择一个孩子时,所有 尚未 被选中的孩子的 幸福值 将减少 1
。注意,幸福值 不能 变成负数,且只有在它是正数的情况下才会减少。
选择 k
个孩子,并使你选中的孩子幸福值之和最大,返回你能够得到的 最大值 。
示例 1:
输入:happiness = [1,2,3], k = 2 输出:4 解释:按以下方式选择 2 个孩子: - 选择幸福值为 3 的孩子。剩余孩子的幸福值变为 [0,1] 。 - 选择幸福值为 1 的孩子。剩余孩子的幸福值变为 [0] 。注意幸福值不能小于 0 。 所选孩子的幸福值之和为 3 + 1 = 4 。
开始想成了临界值是k-i 后面才意识到是n-1-i
class Solution {
public long maximumHappinessSum(int[] happiness, int k) {
Arrays.sort(happiness);
int n = happiness.length;
long ans = 0;
for (int i = n - 1; i >= n - k && happiness[i] > n - 1 - i; i--) {
ans += happiness[i] - (n - 1 - i);
}
return ans;
}
}
给你一个数组 arr
,数组中有 n
个 非空 字符串。
请你求出一个长度为 n
的字符串 answer
,满足:
answer[i]
是arr[i]
最短 的子字符串,且它不是arr
中其他任何字符串的子字符串。如果有多个这样的子字符串存在,answer[i]
应该是它们中字典序最小的一个。如果不存在这样的子字符串,answer[i]
为空字符串。
请你返回数组 answer
。
示例 1:
输入:arr = ["cab","ad","bad","c"] 输出:["ab","","ba",""] 解释:求解过程如下: - 对于字符串 "cab" ,最短没有在其他字符串中出现过的子字符串是 "ca" 或者 "ab" ,我们选择字典序更小的子字符串,也就是 "ab" 。 - 对于字符串 "ad" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "bad" ,最短没有在其他字符串中出现过的子字符串是 "ba" 。 - 对于字符串 "c" ,不存在没有在其他字符串中出现过的子字符串。
示例 2:
输入:arr = ["abc","bcd","abcd"] 输出:["","","abcd"] 解释:求解过程如下: - 对于字符串 "abc" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "bcd" ,不存在没有在其他字符串中出现过的子字符串。 - 对于字符串 "abcd" ,最短没有在其他字符串中出现过的子字符串是 "abcd" 。
暴力
class Solution {
public String[] shortestSubstrings(String[] arr) {
int n = arr.length;
String[] ans = new String[n];
for (int i = 0; i < n; i++) {
int m = arr[i].length();
String res = "";
for (int size = 1; size <= m && res.isEmpty(); size++) {
for (int j = size; j <= m; j++) {
String t = arr[i].substring(j - size, j);
if ((res.isEmpty() || t.compareTo(res) < 0) && check(arr, i, t)) {
res = t;
}
}
}
ans[i] = res;
}
return ans;
}
private boolean check(String[] arr, int i, String sub) {
for (int j = 0; j < arr.length; j++) {
if (j != i && arr[j].contains(sub)) {
return false;
}
}
return true;
}
}