package leetcode;
import java.util.Arrays;
import java.util.Collections;
/*
Author:Samba
Time :2021年8月26日
Data:下午2:08:25
*/
//救生艇
public class t881 {
public static void main(String[] args) {
Solution881 s = new Solution881();
int[] list = {5,1,7,4,2,4};
int result = s.numRescueBoats_02(list, 7);
System.out.println(result);
}
}
class Solution881 {
//方法一: 双循环、标记+枚举
public int numRescueBoats_01(int[] people, int limit) {
int[] flag = new int[people.length];
Integer[] list = new Integer[people.length];
for(int i=0;i<people.length;i++){
list[i]= new Integer(people[i]);
}
Arrays.fill(flag, 0);
Arrays.sort(list,Collections.reverseOrder());
int result = 0;
for (int i =0;i<list.length;i++) {
//首先判断是否已被处理
if(flag[i] == 0) {
if(i == list.length-1) {
flag[i] = 1;
result+=1;
}else {
boolean isFind = false;
for(int j = i+1;j<list.length;j++) {
//如果满足条件并且未被处理则处理掉
if(list[i] + list[j] <= limit&&flag[j]==0) {
flag[i] = 1;
flag[j] = 1;
result+=1;
isFind = true;
break;
}
}
if(!isFind) {
flag[i] = 1;
result+=1;
}
}
}
}
return result;
}
//方法二: 单循环、双游标
public int numRescueBoats_02(int[] people, int limit) {
Arrays.sort(people);
int result = 0;
//设置游标 i,j
int i = 0,j=people.length-1;
while(i<j) {
if(people[i]+people[j]<=limit) {
result+=1;
i++;j--;
}else {
result+=1;
j--;
}
}
//i与j相等说明有个独苗被留下来了
if(i==j) {
result+=1;
}
return result;
}
}