classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int res = INT_MAX; int i = 0; int sum = 0; for(int j = 0; j < nums.size(); j++){ sum += nums[j]; while(i <= j && sum >= target){ res = min(res, j - i + 1); sum -= nums[i]; i++; } }
classSolution { public: int res = 0; intnumSubarrayProductLessThanK(vector<int>& nums, int k){ if(k == 0) return0; queue<int> que; int sum = 1; for(int i = 0; i < nums.size(); i++){ que.push(nums[i]); sum *= nums[i]; while(!que.empty() && sum >= k){ int top = que.front(); que.pop(); sum /= top; } res += que.size(); } return res; } };
时间复杂度:O(n),其中 n 是数组 nums 的大小
空间复杂度:O(n),队列最多有 n 个元素
执行用时:68 ms, 在所有 C++ 提交中击败了53.23%的用户
内存消耗:63 MB, 在所有 C++ 提交中击败了5.26%的用户
通过测试用例:97 / 97
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: int res; intnumSubarrayProductLessThanK(vector<int>& nums, int k){ int i = 0; int sum = 1; for(int j = 0; j < nums.size(); j++){ sum *= nums[j]; while(i <= j && sum >= k){ sum /= nums[i]; i++; } res += j - i + 1; } return res; } };
classSolution { public: intfindTheWinner(int n, int k){ queue<int> que; for(int i = 1; i <= n; i ++){ que.push(i); } int x = k; while(que.size() > 1){ // 循环遍历,直到队列中只剩一人 x --; int top = que.front(); que.pop(); if(x != 0){ // 当还没到第k个,则再次入栈 que.push(top); } else{ // 到第k个,则需要更新x,再次计数 x = k; } } return que.front(); } };
时间复杂度:O(n \ k),其中 n 是做游戏的小伙伴数量,k 是每一轮离开圈子的小伙伴的计数。初始时需要将 n 个元素加入队列,每一轮需要将 k 个元素从队列中取出,将 k−1 个元素加入队列,一共有 n−1 轮,因此时间复杂度是 O(n * k)*。
classSolution { public: longlongappealSum(string s){ longlong res = 0; vector<int> pos(26, -1); for(int i = 0, sum = 0; i < s.size(); i++){ int a = s[i] - 'a'; sum += i - pos[a]; res += sum; pos[a] = i; } return res; } };