贪心算法,
我的思路:先对people数组从小到大排序,然后依次取出最大的未被乘船的,接着从大到小再找出一个体重加一起小于限制的,这样的话之间复杂度应该是o(n2),提交显示超时。
大神的思路:双指针;先对数组排序,从大往小依次乘船,取一个当前状态中最大的,然后看看最小的是否可以和他一起乘船,如果可以一起,那就两个人一起,人数不可以超过2,;如果不可以那么说明剩下的人中也没有可以一起走的,就一个人走;
难点:选取当前最小的作为和当前最大的一起走的搭档,是否符合要求,答案是符合的,这正是题目的妙处所在;
我们假设,W1,W2,W3,..Wn,设当前最大为Wn,假设W1+Wn<=limit,如果W3+Wn<=limt,会不会造成浪费呢,不会,因为此时
W2+W3<W3+Wn<=limit,同样可以两个人一起走,之所以可以这么做贪心,在于最多只可以乘船为2人。
一点体会:这种算法可能只适用于这种特定的场景,不过,从中学习到的更多的是分析问题、解决问题和优化解法思维方式。
class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int count=0;
int left=0,right=people.length-1;
while(left<=right){
count++;
if(people[left]+people[right]<=limit)
left++;
right--;
}
return count;
}
}