今天又开始的新一轮的打卡,就从简单题目开始吧。
数组拆分 I
https://leetcode-cn.com/problems/array-partition-i/submissions/
是一个很有意思的贪心题目,难度很小。
但是证明他的过程可以使用动态规划的方法进行。
但是这次的动态规划,我们从最复杂的情况向着最简单的情况进行思考。
假设这是一个排好序列的2n个元素个数的数组,我们考虑每次可以获得的最大的数字,必定是小于等于排好序的元素的次大数字。采用贪心策略,则取得这个可能的最大数字。接着,将序列的最大数字与之凑成一个元组。
则此时将序列中已经凑成元组的元素舍去,剩下的元素构成了2(n-1)个元素的数组。可以进行依次递归。
代码:
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int n=size(nums);
sort(nums.begin(),nums.end());
int sum=0;
for(int i=0;i<n;i++){
if(i%2==0)
sum+=nums[i];
}
return sum;
}
};
最大连续1的个数:
https://leetcode-cn.com/problems/max-consecutive-ones/
思路:
1、找连续的话,必定有头和尾巴,那么这样更新的话,比累加的普通算法要看起来优美,想起来容易。
2、或者直接模拟计算。
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int start=-1;
int n=size(nums);
int now=0;
int res=0;
int temp=0;
for(int i=0;i<n;i++){
if(nums[i]) continue;
else{
now=i;
temp=now-start-1;
start=now;
if(temp>res) res=temp;
}
}
if(nums[n-1]!=0&&n-start-1>res) res=n-start-1;
return res;
}
};