881. 救生艇
2021-08-28 本文已影响0人
漫行者_
881. 救生艇
本题一开始理解错题目了。理解成,小船不限制成坐数量
思路一开始想的是:
- 尽量先把小的放在一个船上,果然有问题。
- 应该先取一个大的,再尽量放小的。代码写起来很啰里八嗦的。
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
List<Integer> list = new ArrayList<>();
for (int i = 0; i < people.length; i++) {
list.add(people[i]);
}
int num = 0;
while (!list.isEmpty()) {
int h = list.get(list.size() - 1);
int i = 0;
for (; i < list.size() - 1 && h + list.get(i) <= limit; i++) {
h += list.get(i);
}
num++;
for (int j = 0; j < i; j++) {
list.remove(0);
}
list.remove(list.size()-1);
}
return num;
}
然后按照题目要求两个最多:
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
List<Integer> list = new ArrayList<>();
for (int i = 0; i < people.length; i++) {
list.add(people[i]);
}
int num = 0;
while (!list.isEmpty()) {
int h = list.get(list.size() - 1);
int i = 0;
if (i < list.size() - 1 && h + list.get(i) <= limit) {
h += list.get(i);
i++;
}
num++;
for (int j = 0; j < i; j++) {
list.remove(0);
}
list.remove(list.size()-1);
}
return num;
}
用双指针来做:
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int i = 0;
int l = people.length - 1;
int num = 0;
while(i <= l) {
if(people[i] + people[l] > limit) {
l--;
} else {
i++;
l--;
}
num++;
}
return num;
}
证明感觉很难