453. 最小操作次数使数组元素相等 - 力扣(LeetCode)
自己没思路,通过看题解解决
思路:一个长度为n的整数数组,要求每回操作使n-1个元素增加1,反过来思考,那每回操作n-1元素增加1,那与操作剩下那个元素减去1具有异曲同工。
只需要找到数组中最小的元素,并将每个元素与其之差累加起来,就是答案。
//选出n-1个增加1和剩下的那个减少1有什么区别??
class Solution {
public:
int minMoves(vector<int>& nums) {
int minNum = *min_element(nums.begin(), nums.end());
int res = 0;
for (int num : nums)
{
res += num - minNum;
}
return res;
}
};
本题自己有思路,但是深入的一步没有想出来
整体思路为:
1、设置一个标志位,用来记录nums[i]>nums[i+1]的次数,若大于1,则无法通过修改一个值来使得数组变为递减数组。
2、当存在nums[i]>nums[i+1]时候,需要将其更改为nums[i+1]更换为nums[i],这是最简短的方法,或者nums[i]更换为nums[i+1]让其两者相等。以保证后续递减数组持续
3、存在nums[i]>nums[i+1]时候,可能会由nums[i+1]<nums[i-1],这样就要将nums[i+1]=nums[i],以让其恢复递减数组。
class Solution {
public:
bool checkPossibility(vector<int> &nums) {
int n = nums.size(), cnt = 0;
for (int i = 0; i < n - 1; ++i) {
int x = nums[i], y = nums[i + 1];
if (x > y) {
cnt++;
if (cnt > 1) {
return false;
}
if (i > 0 && y < nums[i - 1]) {
nums[i + 1] = x;
}
}
}
return true;
}
};
2834. 找出美丽数组的最小和 - 力扣(LeetCode)
本题较为简单,统计美丽数组的最小和,以目标值的一半为目标,小于目标值一半的数全部拿进来作为数组元素,若此时数小于n,则继续以目标值为起始点,以此往后加,直到数量等于N为止,这里存在一点贪心的味道。
class Solution {
public:
long long minimumPossibleSum(int n, int target) {
long long sum = 0;
//nums是由两两互不相同的正整数组成
for (int i = 1; i <= n; i++)
{
if (i <= target / 2)
{
sum += i;
}
if (i > target / 2)
{
sum += target + i - target / 2-1;
}
}
return sum;
}
};
这里主要体会杨辉三角的递推公式与用代码的方式实现。
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>>result(numRows);
for (int i = 0; i < numRows; i++)
{
result[i].resize(i + 1);
result[i][0] = result[i][i] = 1;
for (int j = 1; j < i; j++)
{
result[i][j] = result[i - 1][j - 1] + result[i - 1][j];
}
}
return result;
}
};