力扣135. 分发糖果
题目:【https://leetcode.cn/problems/candy/description/?envType=study-plan-v2&envId=top-interview-150】

想了一个办法,依次向后遍历,遇到下降(不包含相等)的情况,就将其置为1,并且开始第二层循环,从当前位置向前,依次往前加一,最差情况下时间复杂度接近n的平方,不是最优解
1 class Solution { 2 public: 3 int candy(vector<int>& ratings) { 4 int n = ratings.size(); 5 vector<int> cache(n); 6 7 int ret = 1; 8 cache[0] = 1; 9 for (int i = 1; i < n; ++i) { 10 int l = ratings[i - 1], r = ratings[i]; 11 if (l < r) { 12 cache[i] = cache[i - 1] + 1; ret += cache[i]; 13 continue; 14 } 15 16 cache[i] = 1; ret += cache[i]; 17 for (int j = i; j >= 1; --j) { 18 int l = ratings[j - 1], r = ratings[j]; 19 if (l > r && cache[j - 1] <= cache[j]) { 20 cache[j - 1]++; ret++; 21 } else { 22 break; 23 } 24 } 25 } 26 27 return ret; 28 } 29 };
时间复杂度优化一下,优化至n,代码如下,优化思路是直接根据下降数量count来直接决定需要向前填补的+1数量,这样就不用再cache数组中向前依次+1了。
1 class Solution { 2 public: 3 int candy(vector<int>& ratings) { 4 int n = ratings.size(); 5 vector<int> cache(n); 6 7 int count = 0; 8 int f; 9 int ret = 1; 10 cache[0] = 1; 11 for (int i = 1; i < n; ++i) { 12 int l = ratings[i - 1], r = ratings[i]; 13 if (l < r) { 14 count = 0; 15 cache[i] = cache[i - 1] + 1; ret += cache[i]; 16 continue; 17 } else if (l == r) { 18 count = 0; 19 cache[i] = 1; ret++; 20 continue; 21 } 22 23 cache[i] = 1; ret++; 24 count++; 25 if (1 == count) 26 f = cache[i - 1]; 27 28 ret += count < f ? count - 1 : count; 29 } 30 31 return ret; 32 } 33 };
空间复杂度方面优化一下,优化至n,不过还不是最终形态,空间优化可以通过cache数组操作很容易发现一个问题,就是仅仅需要保存一个【首次开始降低的candy数量】和一个【cache数组的i - 1】,其它并不需要。
1 class Solution { 2 public: 3 int candy(vector<int>& ratings) { 4 int n = ratings.size(); 5 // vector<int> cache(n); 6 7 int count = 0; 8 int f; 9 int ret = 1; 10 int p = 1;//cache[0] = 1; 11 int c = 1; 12 for (int i = 1; i < n; ++i) { 13 int l = ratings[i - 1], r = ratings[i]; 14 if (l < r) { 15 count = 0; 16 c = p + 1; ret += c;// cache[i] = cache[i - 1] + 1; ret += cache[i]; 17 p = c; c = 1; 18 continue; 19 } else if (l == r) { 20 count = 0; 21 /* c = 1; */ ret++;// cache[i] = 1; ret++; 22 p = c; c = 1; 23 continue; 24 } 25 26 /* c = 1; */ ret++;// cache[i] = 1; ret++; 27 count++; 28 if (1 == count) 29 f = p;// f = cache[i - 1]; 30 31 ret += count < f ? count - 1 : count; 32 p = c; c = 1; 33 } 34 35 return ret; 36 } 37 };
最后简化逻辑,将时间空间都优化成On
1 class Solution { 2 public: 3 int candy(vector<int>& ratings) { 4 int n = ratings.size(); 5 6 int count = 0; 7 int f; 8 int ret = 1; 9 int p = 1; 10 for (int i = 1; i < n; ++i) { 11 int l = ratings[i - 1], r = ratings[i]; 12 if (l < r) { 13 count = 0; 14 p++; 15 ret += p; 16 continue; 17 } else if (l == r) { 18 count = 0; 19 ret++; 20 p = 1; 21 continue; 22 } 23 24 count++; if (1 == count) f = p; 25 26 ret += count < f ? count : count + 1; 27 p = 1; 28 } 29 30 return ret; 31 } 32 };
浙公网安备 33010602011771号