🌻算法,不如说它是一种思考方式🍀
算法专栏: 👉🏻123
一、🌱2023-spring 1. 补给马车
-
题目描述:远征队即将开启未知的冒险之旅,不过在此之前,将对补给车队进行最后的检查。
supplies[i]
表示编号为i
的补给马车装载的物资数量。
考虑到车队过长容易被野兽偷袭,他们决定将车队的长度变为原来的一半(向下取整),计划为:
找出车队中 物资之和最小 两辆 相邻 马车,将它们车辆的物资整合为一辆。若存在多组物资之和相同的马车,则取编号最小的两辆马车进行整合;
重复上述操作直到车队长度符合要求。
请返回车队长度符合要求后,物资的分布情况。 -
来源:力扣(LeetCode)
-
难度:简单
-
提示:
2 <= supplies.length <= 1000
1 <= supplies[i] <= 1000 -
示例 1:
输入:supplies = [7,3,6,1,8]
输出:[10,15]
解释:
第 1 次合并,符合条件的两辆马车为 6,1,合并后的车队为 [7,3,7,8];
第 2 次合并,符合条件的两辆马车为 (7,3) 和 (3,7),取编号最小的 (7,3),合并后的车队为 [10,7,8];
第 3 次合并,符合条件的两辆马车为 7,8,合并后的车队为 [10,15];
返回 [10,15]
示例 2:
输入:supplies = [1,3,1,5]
输出:[5,5]
🌴解题
模拟
即找出数组相邻的两个数之和,对当前一轮最小的和的元素进行合并,调整之后继续直到长度满足要求(长度为原来一半)。
class Solution {
public int[] supplyWagon(int[] supplies) {
int lengthA= supplies.length/2;//整理后的车队长度
int length= supplies.length;//原车队长度
int k=1,j=1,min=0;// min - k; i - j
while(length>lengthA) {//对车队长度修整并递减
int sum=1000000;//要求整合最小的,那我取一个最大的,来记录
boolean tag=true;
j=1;
for (int i = 0; i < supplies.length&&j< supplies.length; i++) {//遍历车队,i j 是相邻的两辆车
//1. 找车 i
while (supplies[i]==0) {//数值为 0,表示车子已经被合并,不存在了
i++;
if(i>= supplies.length){
tag=false;//结束标志
break;
}
}
if(!tag)//结束标志,结束 for 循环
break;
//2. 找车 j
j=i+1;
if(j>= supplies.length)
break;
while (supplies[j]==0) {
j++;
if(j>= supplies.length){
tag=false;
break;
}
}
if(!tag)//结束标志,结束 for 循环
break;
if(supplies[i]+supplies[j]<sum){//找到较小的相邻两车
min=i;
k=j;
sum=supplies[i]+supplies[j];
}
}
//找到当前车队最小的相邻两车,合并
supplies[min]=supplies[min]+supplies[k];
supplies[k]=0;
length--;
}
//返回新车队数组
int[] ans=new int[lengthA];
j=0;
for (int i = 0; i < lengthA&&j< supplies.length; i++,j++) {
while (supplies[j]==0)
j++;
ans[i]=supplies[j];
}
return ans;
}
}
过啦!
返回第一页。☝
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓