455. 分发饼干
用贪心算法解决问题,先求局部最优,再求整体最优。
我自己的想法是先对这两个数组按照从小到大排序,然后求满足条件的解并计数。
代码随想录的解法是先用大饼干满足大胃口的小孩。我自己的想法就是用小饼干满足小胃口的小孩。其实这两种方法都可以!
void bubbleSort(int * arr, int len){
int tmp, i, j;
for (i = 0; i < len - 1; i++){
for (j = 0; j < len - 1 - i; j++){
if (arr[j] > arr[j + 1]){
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int findContentChildren(int* g, int gSize, int* s, int sSize){
bubbleSort(g, gSize);
bubbleSort(s, sSize);
int i, j = 0, cnt = 0;
for (i = 0; i < gSize; i++){
while (j < sSize && s[j] < g[i]){
j++;
if (j == sSize){
break;
}
}
if (j < sSize && s[j] >= g[i]){
cnt++;
j++;
}
}
return cnt;
}
或者用C++语言实现。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
//对孩子胃口值和饼干尺寸按从小到大排序
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int cnt = 0, j = 0;
for (int i = 0; i < g.size(); i++){
//当饼干尺寸不满足孩子胃口时继续寻找
while (j < s.size() && s[j] < g[i]){
j++;
}
//饼干尺寸遍历结束
if (j == s.size()){
break;
}
//找到合适的饼干
else if (s[j] >= g[i]){
cnt++;
j++;
}
}
//输出结果
return cnt;
}
};
376. 摆动序列
我自己的想法是先计算出两两数字之间的差值,然后再计算 摆动序列 的 最长子序列的长度,设计了一个辅助数组 。
代码随想录的做法是考虑不同的场景,然后记录prediff和curdiff,有摆动的时候才更新prediff。
int wiggleMaxLength(int* nums, int numsSize){
int * arr = (int *) malloc (sizeof(int) * (numsSize - 1));
int i, cnt = 2, sign = 1;
for (i = 0; i < numsSize - 1; i++){
arr[i] = nums[i + 1] - nums[i];
}
if (numsSize == 1){
return numsSize;
}
if (numsSize == 2 && nums[1] != nums[0]){
return numsSize;
}
if (numsSize == 2 && nums[1] == nums[0]){
return 1;
}
i = 0;
while (i < numsSize - 1 && arr[i] == 0){
i++;
}
if (i == numsSize - 1){
return 1;
}
if (arr[i] < 0){
sign = -1;
}
for (i = 1; i < numsSize - 1; i++){
if (arr[i] * sign < 0){
cnt++;
sign = -sign;
}
}
return cnt;
}
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() == 1){
return 1;
}
int i, ret = 1, pre = 0, cur = 0;
for (i = 1; i < nums.size(); i++){
cur = nums[i] - nums[i - 1];
if (pre <= 0 && cur > 0 ||
(pre >= 0 && cur < 0)){
ret++;
//只在摆动变化的时候更新pre
pre = cur;
}
// pre = cur;
}
return ret;
}
};
53. 最大子数组和
我最初没有什么想法,暴力解题,两层for循环计算所有的子数组的元素和,超出了时间限制。
代码随想录的解法一层循环就可以了,只要当前计算的和为负数,那么不论加上哪个数字,都会使得这个数字变小,于是就从当前的这个数字开始重新计算和。
int maxSubArray(int* nums, int numsSize){
int i, j, sum = 0, max = nums[0];
for (i = 0; i < numsSize; i++){
sum += nums[i];
if (sum > max){
max = sum;
}
if (sum < 0){
sum = 0;
}
}
return max;
}
努力啊!!!