建站 网站程序有哪些,成都网站建设找亮帅,月夜直播免费版,joomla 做外贸网站 好的题目
1005. K 次取反后最大化的数组和
简单
相关标签
贪心 数组 排序
给你一个整数数组 nums 和一个整数 k #xff0c;按以下方法修改该数组#xff1a;
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以…题目
1005. K 次取反后最大化的数组和
简单
相关标签
贪心 数组 排序
给你一个整数数组 nums 和一个整数 k 按以下方法修改该数组
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后返回数组 可能的最大和 。 示例 1
输入nums [4,2,3], k 1
输出5
解释选择下标 1 nums 变为 [4,-2,3] 。示例 2
输入nums [3,-1,0,2], k 3
输出6
解释选择下标 (1, 2, 2) nums 变为 [3,1,0,2] 。示例 3
输入nums [2,-3,-1,5,-4], k 2
输出13
解释选择下标 (1, 4) nums 变为 [2,3,-1,5,4] 。提示
1 nums.length 104-100 nums[i] 1001 k 104
思路和解题方法 首先我们需要对数组进行排序。由于是要使数组中的数尽可能地都为正数因此我们应该把绝对值小的负数变为正数。 这样一来负数的数量就会减少而整数和零的数量就会增加这有利于最终结果更接近最优解。 排序后我们可以从小到大遍历数组每当遇到一个负数就将其取反同时减少可取反的次数 k。 这里有个问题如果我们仅仅只考虑绝对值最小的那个负数需要取反多少次呢显然如果可取反的次数 k 为奇数那么最终结果就是把绝对值最小的那个负数取反而如果可取反的次数 k 为偶数则不需要取反它。 另一方面如果可取反的次数 k 为偶数那么显然数组中所有的数都会保持不变。最后我们只需简单地处理一下数组的和即可。 复杂度 时间复杂度: O(n * logn) 时间复杂度排序的时间复杂度为 O(nlogn)for 循环的时间复杂度为 O(n)因此总的时间复杂度为 O(nlogn nlogn n) O(nlogn)。 空间复杂度 O(1) 空间复杂度除了输入的数组外算法只涉及到常量级别的额外空间。因此空间复杂度为 O(1)。 c 代码一
class Solution {
public:int largestSumAfterKNegations(vectorint nums, int k) {sort(nums.begin(), nums.end()); // 对数组进行排序使得负数排在前面int min1 1000; // 初始化绝对值最小的元素为一个较大的数int min2 0; // 记录绝对值最小的元素的索引for (int i0; inums.size(); i) {if(abs(nums[i]) min1) { // 如果当前元素的绝对值小于等于min1min1 abs(nums[i]); // 更新min1为当前元素的绝对值min2 i; // 记录绝对值最小的元素的索引}if(nums[i] 0 k 0) { // 如果当前元素是负数且还有剩余的翻转次数nums[i] * -1; // 将当前元素取反k--; // 翻转次数k减一}}if(k%2 1) // 如果剩余的翻转次数是奇数nums[min2] * -1; // 将绝对值最小的元素取反int ans 0;for(int n : nums)ans n; // 计算数组中所有元素的和return ans; // 返回最终的数组和作为结果}
};思路和解题方法二 对数组进行排序 排序函数中采用自定义比较器的方式把按照绝对值从大到小进行排序。这样排序后数组中绝对值最大的元素会排在数组的最末尾而绝对值最小的元素则会排在数组的最前面。 取反负数 遍历数组如果当前的元素是负数那么就把它取反变为正数同时将剩余可取反次数减一。注意我们要在剩余可取反次数大于 0 且当前元素是负数的情况下才能取反。 处理无法取反的情况 如果我们完成了步骤 2 后还有剩余可取反的次数但已经不存在可以被取反的元素了那么我们需要对数组进行调整使得我们所取反的元素的绝对值最小。具体地说我们需要在数组的最末尾找到一个元素并将它取反。因为这个元素绝对值最大所以取反后对原来的和的影响最小。由于我们对数组进行了排序因此直接访问最末尾的元素即可。 计算数组的和 遍历整个数组计算所有元素之和即可。最终的和就是我们的答案。 复杂度 时间复杂度: O(n * logn) 时间复杂度排序的时间复杂度为 O(nlogn)for 循环的时间复杂度为 O(n)因此总的时间复杂度为 O(nlogn nlogn n) O(nlogn)。 空间复杂度 O(1) 空间复杂度除了输入的数组外算法只涉及到常量级别的额外空间。因此空间复杂度为 O(1)。 c 代码二
class Solution {// 定义排序比较器按照绝对值从大到小排序static bool cmp(int a, int b) {return abs(a) abs(b);}
public:int largestSumAfterKNegations(vectorint A, int K) {sort(A.begin(), A.end(), cmp); // 第一步对数组进行排序for (int i 0; i A.size(); i) { // 第二步取反负数if (A[i] 0 K 0) {A[i] * -1;K--;}}if (K % 2 1) A[A.size() - 1] * -1; // 第三步处理无法取反的情况int result 0;for (int a : A) result a; // 第四步计算数组和return result;}
}觉得有用的话可以点点赞支持一下。
如果愿意的话关注一下。会对你有更多的帮助。 每天都会不定时更新哦 人 。