64,199
社区成员
发帖
与我相关
我的任务
分享最后四天!!
冲冲冲!!
1.
两个数对 (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) {
sort (nums.begin(),nums.end());
int m=nums.size();
return (nums[m-1]*nums[m-2])-(nums[0]*nums[1]);
}
};
2.
昨天的题
3.
给定长度为 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 ans =0;
for (int i=0;i<nums.size()/2;i++){
ans+=nums[i*2];
}
return ans;
}
};
4.
还是昨天的题目(=-=!
5.
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。
这题需要注意大数要从后往前插入
class Solution {
public:
void wiggleSort(vector<int>& nums) {
int ans[nums.size()];
int n=nums.size();
sort (nums.begin(),nums.end());
for (int i=0;i<(nums.size()+1)/2;i++){
ans[2*i]=nums[(nums.size()-1)/2-i];
if (2*i+1==nums.size()) break;
ans[2*i+1]=nums[nums.size()-i-1];
}
for (int i=0;i<nums.size();i++){
nums[i]=ans[i];
}
}
};
6.
给你一个整数数组 nums (下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。
比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 nums = [1,3,3] 。
请你返回使 nums 严格递增 的 最少 操作次数。
我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。
直接贪心数就好了
class Solution {
public:
int minOperations(vector<int>& nums) {
int ans=0;
for (int i=1;i<nums.size();i++){
if (nums[i]<=nums[i-1]){
ans+=nums[i-1]+1-nums[i];
nums[i]=nums[i-1]+1;
}
}
return ans;
}
};
7.
给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。
返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。
和上题一样的方法
class Solution {
public:
int minIncrementForUnique(vector<int>& nums) {
int ans=0;
sort (nums.begin(),nums.end());
for (int i=1;i<nums.size();i++){
if (nums[i]<=nums[i-1]){
ans+=nums[i-1]+1-nums[i];
nums[i]=nums[i-1]+1;
}
}
return ans;
}
};
8.
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
这题需要优化的是第三层循环,这里采用浮动指针
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int n = nums.size();
if (n<3) return 0;
sort(nums.begin(), nums.end());
int ans = 0;
for (int i = 0; i < n; i++) {
if (nums[i]==0) continue;
for (int j = i + 1,t = j + 1; j < n; j++) {
while (t < n && nums[t] < nums[i] + nums[j]) {
++t;
}
if (j==t) continue;
ans += t - j - 1;
}
}
return ans;
}
};