1550. 存在连续三个奇数的数组
难度简单3
给你一个整数数组
arr
,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回true
;否则,返回false
。
示例 1:
输入:arr = [2,6,4,1] 输出:false 解释:不存在连续三个元素都是奇数的情况。示例 2:
输入:arr = [1,2,34,3,4,5,7,23,12] 输出:true 解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。
提示:
1 <= arr.length <= 1000
1 <= arr[i] <= 1000
class Solution {
public boolean threeConsecutiveOdds(int[] arr) {
int cnt=0;
for(int i:arr){
if(i%2==1){
cnt++;
if(cnt==3){
return true;
}
}else{
if(cnt>0){
cnt=0;
}
}
}
return cnt==3;
}
}
1551. 使数组中所有元素相等的最小操作数
难度中等7
存在一个长度为
n
的数组arr
,其中arr[i] = (2 * i) + 1
(0 <= i < n
)。一次操作中,你可以选出两个下标,记作
x
和y
(0 <= x, y < n
)并使arr[x]
减去1
、arr[y]
加上1
(即arr[x] -=1
且arr[y] += 1
)。最终的目标是使数组中的所有元素都 相等 。题目测试用例将会 保证 :在执行若干步操作后,数组中的所有元素最终可以全部相等。给你一个整数
n
,即数组的长度。请你返回使数组arr
中所有元素相等所需的 最小操作数 。
示例 1:
输入:n = 3 输出:2 解释:arr = [1, 3, 5] 第一次操作选出 x = 2 和 y = 0,使数组变为 [2, 3, 4] 第二次操作继续选出 x = 2 和 y = 0,数组将会变成 [3, 3, 3]示例 2:
输入:n = 6 输出:9
提示:
1 <= n <= 10^4
给出的是一个等差数列,按照题意,只需要看每个数与平均数的距离,这个用数学可以直接算出结果,我还是模拟了一下
class Solution {
// 数组是一系列奇数:1,3,5,7...
// 每次减一加一,那么对于数组总和来说,是没变的
// 最终相等,说明得到了平均数
// 比如1,3,5,7 -> 4,4,4,4
// 肯定是(1,7)操作三次,(3,5)操作一次
// 即使是奇数个,那么也只需要管n/2,因为中间一个恰好是平均值
public int minOperations(int n) {
int sum=n*n;
int avg=sum/n;
int rs=0;
// 就是n*n/2 - (n/2)*(n/2) = n*n/4
// 即平均数乘以n/2,然后减去前n/2的求和
for(int i=0;i
1552. 两球之间的磁力
难度中等25
在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有
n
个空的篮子,第i
个篮子的位置在position[i]
,Morty 想把m
个球放到这些篮子里,使得任意两球间 最小磁力 最大。已知两个球如果分别位于
x
和y
,那么它们之间的磁力为|x - y|
。给你一个整数数组
position
和一个整数m
,请你返回最大化的最小磁力。
示例 1:
输入:position = [1,2,3,4,7], m = 3 输出:3 解释:将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。示例 2:
输入:position = [5,4,3,2,1,1000000000], m = 2 输出:999999999 解释:我们使用位于 1 和 1000000000 的篮子时最小磁力最大。
提示:
n == position.length
2 <= n <= 10^5
1 <= position[i] <= 10^9
- 所有
position
中的整数 互不相同 。2 <= m <= position.length
这个类型的题遇到第三次了:分别是小张刷题计划,分割数组的最大值,以及本题
但是还是没有直觉..
class Solution {
// 使得任意两球间 最小磁力 最大
// 是指,任意两对之间磁力最小的那一对磁力最大
// 也就是让其最小值最大,而磁力值是由距离决定的
// 所以就是让相邻最近的两个球的距离最大
// 可知相邻最近的的最大距离是等距的时候
private boolean check(int[] pos,int dist,int m){
// 判断相隔距离为dist时,能放多少个球
int cnt=1;
int last=0;
for(int i=1;i=dist){
cnt++;
last=i;
}
}
return cnt>=m;
}
public int maxDistance(int[] position, int m) {
Arrays.sort(position);
int hi=(position[position.length-1]-position[0])/(m-1);
int lo=Integer.MAX_VALUE;
for(int i=1;i=m,说明间隔还比较小,可以调大一点
lo=mid+1;
}else{
//
1553. 吃掉 N 个橘子的最少天数
难度困难34
厨房里总共有
n
个橘子,你决定每一天选择如下方式之一吃这些橘子:
- 吃掉一个橘子。
- 如果剩余橘子数
n
能被 2 整除,那么你可以吃掉n/2
个橘子。- 如果剩余橘子数
n
能被 3 整除,那么你可以吃掉2*(n/3)
个橘子。每天你只能从以上 3 种方案中选择一种方案。
请你返回吃掉所有
n
个橘子的最少天数。
示例 1:
输入:n = 10 输出:4 解释:你总共有 10 个橘子。 第 1 天:吃 1 个橘子,剩余橘子数 10 - 1 = 9。 第 2 天:吃 6 个橘子,剩余橘子数 9 - 2*(9/3) = 9 - 6 = 3。(9 可以被 3 整除) 第 3 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。 第 4 天:吃掉最后 1 个橘子,剩余橘子数 1 - 1 = 0。 你需要至少 4 天吃掉 10 个橘子。示例 2:
输入:n = 6 输出:3 解释:你总共有 6 个橘子。 第 1 天:吃 3 个橘子,剩余橘子数 6 - 6/2 = 6 - 3 = 3。(6 可以被 2 整除) 第 2 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。(3 可以被 3 整除) 第 3 天:吃掉剩余 1 个橘子,剩余橘子数 1 - 1 = 0。 你至少需要 3 天吃掉 6 个橘子。示例 3:
输入:n = 1 输出:1示例 4:
输入:n = 56 输出:6
提示:
1 <= n <= 2*10^9
本题难度主要在于,n可以取到2*10^9,所以直接翻译题意多半不能通过
这里要优化的点在于,吃一个太慢了,我们的做法是尽量吃一半,或者三分之二,仅当不满足前两者的条件时才吃一个(有点贪心的意思
然后当然要用记忆化搜索
搬运大佬的
import java.util.HashMap;
class Solution {
private HashMap map;
private int helper(int n) {
if (n == 1) {
return 1;
}
if (n == 2 || n == 3) {
return 2;
}
if (map.containsKey(n)) {
return map.get(n);
}
// 这个写法绝了
int t = Math.min(helper(n / 2) + 1 + n % 2, helper(n / 3) + 1 + n % 3);
map.put(n, t);
return t;
}
public int minDays(int n) {
map = new HashMap<>();
int t = helper(n);
return t;
}
}