⭐️寒假新坑——代码之狐的每日做题笔记
第一题,贪心思想(每次拿最大的两个,然后免费拿最大的第三个——能够免费拿的糖数量是有限的,为什么不免费一个贵的呢)
第二题,数学思维(所有数字都在一个范围里面,只需要记录最大和最小的值即可,差值数组表示每个值都是统一变化的,最大最小值统一+n/-n;找到满足范围的可能即可)
第三题,BFS(我得精简一下我的代码结构了,好好梳理一下经典方法 😢)
第四题,DP(没什么好说的,甚至不如第三题)
2144. 打折购买糖果的最小开销
一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。
免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。
- 比方说,总共有
4
个糖果,价格分别为1
,2
,3
和4
,一位顾客买了价格为2
和3
的糖果,那么他可以免费获得价格为1
的糖果,但不能获得价格为4
的糖果。
给你一个下标从 0 开始的整数数组 cost
,其中 cost[i]
表示第 i
个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。
class Solution {
public int minimumCost(int[] cost) {
Arrays.sort(cost);
int i=cost.length-1;
int sum=0;
while(i>=0){
sum+=cost[i--];
if(i>=0)
sum+=cost[i--];
if(i>=0){
i--;
}
}
return sum;
}
}
2145. 统计隐藏数组数目-Mid
给你一个下标从 0 开始且长度为 n
的整数数组 differences
,它表示一个长度为 n + 1
的 隐藏 数组 相邻 元素之间的 差值 。更正式的表述为:我们将隐藏数组记作 hidden
,那么 differences[i] = hidden[i + 1] - hidden[i]
。
同时给你两个整数 lower
和 upper
,它们表示隐藏数组中所有数字的值都在 闭 区间 [lower, upper]
之间。
-
比方说,
differences = [1, -3, 4]
,
lower = 1
,
upper = 6
,那么隐藏数组是一个长度为
4
且所有值都在
1
和
6
(包含两者)之间的数组。
[3, 4, 1, 5]
和[4, 5, 2, 6]
都是符合要求的隐藏数组。[5, 6, 3, 7]
不符合要求,因为它包含大于6
的元素。[1, 2, 3, 4]
不符合要求,因为相邻元素的差值不符合给定数据。
请你返回 符合 要求的隐藏数组的数目。如果没有符合要求的隐藏数组,请返回 0
。
class Solution {
public int numberOfArrays(int[] differences, int lower, int upper) {
int max=0;
int min=0;
int dp=0;
for(int i:differences){
dp+=i;
if(dp<min){
min=dp;
}
if(dp>max){
max=dp;
}
//剪枝,不然有可能越界
if(upper-lower-(max-min)+1<0){
return 0;
}
}
return upper-lower-(max-min)+1<0?0