题目
LeetCode881:救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
题解
C++实现
- 调用系统排序方法,sort(people.begin(), people.end());
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(), people.end());
int num = 0;
for (int i = 0,j=people.size()-1; i<=j; j--) {
if (people[i]+people[j]<=limit) {
i++;
}
num++;
}
return num;
}
};
int main(int argc, const char * argv[]) {
Solution test;
vector<int> people = {2,49,10,7,11,41,47,2,22,6,13,12,33,18,10,26,2,6,50,10};
int n = test.numRescueBoats(people, 50);
cout << n;
return 0;
}
C实现
//堆排序
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void swap(int* a,int *b){
int tmp = *b;
*b = *a;
*a = tmp;
}
//初始化堆
void adjustHeap(int a[],int i,int n){
int child; //孩子结点
int temp; //临时变量
/*对堆进行整理*/
for(temp = a[i]; i * 2 + 1 < n; i = child){
child = i * 2 + 1; //当前结点的左孩子结点
if(child != n - 1 && a[child] < a[child + 1]) //比较左孩子和右孩子谁大
child++;
if(temp < a[child])
a[i] = a[child];
else
break;
}
a[i] = temp;
}
//堆排序
void myheapSort(int nums[],int n){
//初始化堆,构建最大堆
for(int i=n/2;i>=0;i--){ //从最后一个非终端节点开始,由下向上
adjustHeap(nums, i, n);
}
//进行堆排序
for (int i=n-1; i>=0; i--) {
swap(&nums[0], &nums[i]);
adjustHeap(nums, 0, i);
}
}
int numRescueBoats(int* people, int peopleSize, int limit) {
myheapSort(people,peopleSize);
for(int i=0;i<peopleSize;i++){
printf("%d ",people[i]);
}
int i=0,j=peopleSize-1,n=0;
for (; i<=j; j--,n++) {
if (people[i]+people[j]<=limit) {
i++;
}
}
return n;
}
int main(int argc, const char * argv[]) {
int people[4] = {3,5,3,4};
int n = numRescueBoats(people, 4 ,5);
return 0;
}