1. 程式人生 > >[Leetcode 881]船救人 Boats to Save People 貪心

[Leetcode 881]船救人 Boats to Save People 貪心

【題目】

The i-th person has weight people[i], and each boat can carry a maximum weight of limit.

Each boat carries at most 2 people at the same time, provided the sum of the weight of those people is at most limit.

Return the minimum number of boats to carry every given person.  (It is guaranteed each person can be carried by a boat.) 

船隻能坐兩人,有體重限制,找出最少船隻數。

【思路】

貪心演算法,sort排序陣列,頭尾指標p、q。

每次取最重的,如果未超過limit,【順走】最輕的。

所以尾指標q和答案ans必減,頭指標p只在limit條件下減少。

【程式碼】

class Solution {
  public int numRescueBoats(int[] people, int limit) {
    Arrays.sort(people);
    int p=0,q=people.length-1,ans=0;

    while(p<=q){
      ans++;
      if(people[p]+people[q]<=limit

){
        p++;
      }
      q--;
    } 
  return ans;
  }
}

【例子】

Example 1:

Input: people = [1,2], limit = 3
Output: 1
Explanation: 1 boat (1, 2)

Example 2:

Input: people = [3,2,2,1], limit = 3
Output: 3
Explanation: 3 boats (1, 2), (2) and (3)

Example 3:

Input: people = [3,5,3,4], limit = 5
Output: 4
Explanation: 4 boats (3), (3), (4), (5)