练习题
1 题目描述 1913. 两个数对之间的最大乘积差
两个数对 (a, b)
和 (c, d)
之间的 乘积差 定义为 (a * b) - (c * d)
。
- 例如,
(5, 6)
和(2, 7)
之间的乘积差是(5 * 6) - (2 * 7) = 16
。
给你一个整数数组 nums
,选出四个 不同的 下标 w
、x
、y
和 z
,使数对 (nums[w], nums[x])
和 (nums[y], nums[z])
之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
class Solution {
public:
int maxProductDifference(vector<int>& nums)
{
int length=nums.size();
int max=0,max_num=0;
for(int i=0;i<length;i++)
{
if(nums[i]>max)
{
max=nums[i];
max_num=i;
}
}
nums[max_num]=0;
int max_2=0,max_num_2=0;
for(int i=0;i<length;i++)
{
if(nums[i]>max_2)
{
max_2=nums[i];
max_num_2=i;
}
}
nums[max_num]=max;
int min=10000,min_num=0;
for(int i=0;i<length;i++)
{
if(nums[i]<min)
{
min=nums[i];
min_num=i;
}
}
nums[min_num]=10000;
int min_2=10000,min_num_2=0;
for(int i=0;i<length;i++)
{
if(nums[i]<min_2)
{
min_2=nums[i];
min_num_2=i;
}
}
return (max*max_2-min*min_2);
}
};
2 题目描述 976.三角形的最大周长
给定由一些正数(代表长度)组成的数组 A
,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0
。
class Solution {
public:
int largestPerimeter(vector<int>& nums)
{
int length=nums.size();
sort(nums.begin(), nums.end(),greater<int>());
for(int i=0;i<length-2;i++)
{
if(nums[i]>=(nums[i+1]+nums[i+2]))
{
continue;
}
else
{
return nums[i]+nums[i+1]+nums[i+2];
}
}
return 0;
}
};
3 题目描述 561.数组拆分扣I
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和
class Solution {
public:
int arrayPairSum(vector<int>& nums)
{
sort(nums.begin(),nums.end());
int sum=0;
for(int i=0;i<nums.size();i=i+2)
{
sum+=nums[i];
}
return sum;
}
};
4 题目描述 881.救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit)
{
sort(people.begin(),people.end());
int n = people.size();
int l = 0, r = n - 1;
int ans = 0;
while (l <= r) {
if (people[l] + people[r] <= limit) l++;
r--;
ans++;
}
return ans;
}
};
5 题目描述 摆动序列II
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。
class Solution {
public:
void wiggleSort(vector<int>& nums)
{
//进行向量的赋值操作
vector<int> temp(nums);
int length=nums.size();
sort(temp.begin(),temp.end());
int sum=length-1;
for(int i=1;i<length;i+=2)
{
nums[i]=temp[sum];
sum--;
}
for(int i=0;i<length;i+=2)
{
nums[i]=temp[sum];
sum--;
}
}
};
6 题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
if (g.size()<1||s.size()<1)
{
return 0;
}
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int j=s.size()-1;
int num=0;
for(int i=g.size()-1;i>=0;i--)
{
if(j<0)
{
break;
}
else if((s[j]>=g[i])&&j>=0)
{
num++;
j--;
}
}
return num;
}
};
7 题目描述
给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。
返回使 nums 中的每个值都变成唯一的所需要的最少操作次数
class Solution {
public:
int minIncrementForUnique(vector<int>& nums)
{
sort(nums.begin(),nums.end());
int length=nums.size();
int cnt=0;
for(int i=1;i<length;i++)
{
if(nums[i]<nums[i-1]+1)
{
cnt+=nums[i-1]+1-nums[i];
nums[i]=nums[i-1]+1;
}
}
return cnt;
}
};
8 题目描述
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
int length=nums.size();
sort(nums.begin(),nums.end());
int sum=0;
for(int i=0;i<length-2;i++)
{
for(int j=i+1;j<length-1;j++)
{
int left = j + 1, right = length - 1, k = j;
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] < nums[i] + nums[j]) {
k = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
sum += k - j;
}
}
return sum;
}
};
心得体会
1 要善于使用双指针法