思路:前缀和的简单运用,遍历一遍即可
class Solution { public: int pivotInteger(int n) { vector<int> a(n + 1, 0); for(int i = 1; i <= n; i++) a[i] = a[i-1] + i; for(int i = 1; i <= n; i++) { if(a[n] - a[i - 1] == a[i]) return i; } return -1; } };
6246. 追加字符以获得子序列 - 力扣(LeetCode)
思路:暴力即可
class Solution { public: int appendCharacters(string s, string t) { int res = 0; int j = 0; for(int i = 0; i < s.size(); i++) { if(j == t.size()) break; if(s[i] == t[j]) j++; } res += t.size() - j; return res; } };
思路:用双端队列来维护,然后将队列里的元素变成链表即可,用其他数据结构也可以,然后new的时间开销是比较大的,所以直接修改原链表更好
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeNodes(ListNode* head) { deque<int> de; ListNode* p = head; while(p != NULL) { while(!de.empty() && de.back() < p->val) de.pop_back(); de.push_back(p->val); p = p->next; } ListNode* head1 = NULL,* tail = NULL; while(!de.empty()) { if(!head1) { head1 = tail = new ListNode(de.front()); de.pop_front(); } else { tail->next = new ListNode(de.front()); de.pop_front(); tail = tail->next; } } return head1; } };
6248. 统计中位数为 K 的子数组 - 力扣(LeetCode)
思路:我们首先找到k的位置,然后将k变为0,比k大的为1,小的为-1,目标子数组等价于含有下标pos且和为0或1,我们统计pos之后的比k大的数,减去比k小的个数,再统计pos之前的比k小的数,减去比k大的个数,个数累加起来就是答案
class Solution { public: int countSubarrays(vector<int>& nums, int k) { int n = nums.size(), index; for(int i = 0; i < n; i++) //找到k的位置 if(nums[i] == k) { index = i; break; } unordered_map<int, int> mp; int sum = 0; for(int i = index; i < n; i++) { if(nums[i] > k) sum++; else if(nums[i] < k) sum--; mp[sum]++; } int res = 0; sum = 0; for(int i = index; i >= 0; i--) { if(nums[i] > k) sum++; else if(nums[i] < k) sum--; if(mp.count(1 - sum)) res += mp[1 - sum]; if(mp.count(-sum)) res += mp[-sum]; } return res; } };