前言
记录几个面试常见题型
一、知识点
贪心思想
二、题目
1、1913. 两个数对之间的最大乘积差
1.1 分析
有序,找边界
1.2代码
class Solution {
public:
int maxProductDifference(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size();
int a = nums[0] , b = nums[1] , c = nums[n - 1] , d=nums[n -2];
return abs((a * b) - (c * d));
}
};
2、三角形的最大周长
2.1题目分析
本题单调性, a + b > c, c作为最大边越大越好
2.2代码
class Solution {
public:
int largestPerimeter(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size();
for(int i = n - 1 ; i > 1 ; i --)
if(nums[i - 1] + nums[i - 2] > nums[i])
return nums[i - 1] + nums[i - 2] + nums[i];
return 0;
}
};
3、数组划分一
3.1题目分析
简单贪心
3.2代码
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size() , sum = 0;
for(int i = n - 2 ; i >=0 ; i-=2 )
{
sum += nums[i];
}
return sum;
}
};
4、881救生艇
4.1题目分析
4.2代码
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
int n = people.size() , num =0;
int i = 0, j = n -1;
sort(people.begin(),people.end(),greater<int>());
while(i <= j)
{
if(i == j){
num ++;
break;
}
else if(people[i] + people[j] > limit)
{
i++ ;
num ++;
}
else i ++,j -- ,num ++;
}
return num;
}
};
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(), people.end());
int res = 0;
for (int i = 0, j = people.size() - 1; i <= j; j -- ) {
if (people[j] + people[i] <= limit) i ++ ;
res ++ ;
}
return res;
}
};
5、324摆动排序II
5.1题目分析
5.2代码
class Solution {
public:
void wiggleSort(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<int> tmp(nums.size(),0);
int k = nums.size();
for(int i = 1;i < nums.size();i += 2){
tmp[i] = nums[--k]; //这样插入 * 6 * 5 * 4
}
for(int i = 0;i < nums.size();i += 2){
tmp[i] = nums[--k]; //这样插入 1 * 1 * 2 *
}
nums.swap(tmp);
//memcpy(nums,tmp,sizeof(int)*nums.size());
//memcpy(nums, ret, sizeof(int) * numsSize);
}
};
class Solution {
public:
void wiggleSort(vector<int>& nums) {
int n = nums.size();
auto midptr = nums.begin() + n / 2;
nth_element(nums.begin(), midptr, nums.end());
int mid = *midptr;
#define A(i) nums[(i * 2 + 1) % (n | 1)]
for (int i = 0, j = 0, k = n - 1; i <= k;) {
if (A(i) > mid) swap(A(i ++ ), A(j ++ ));
else if (A(i) < mid) swap(A(i), A(k -- ));
else i ++ ;
}
}
};

164

被折叠的 条评论
为什么被折叠?



