leetcode第 321 场周赛补题

6245. 找出中枢整数 - 力扣(LeetCode)

思路:前缀和的简单运用,遍历一遍即可

class Solution {
public:
    int pivotInteger(int n) {
        vector 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;
    }
};

6247. 从链表中移除节点 - 力扣(LeetCode)

思路:用双端队列来维护,然后将队列里的元素变成链表即可,用其他数据结构也可以,然后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 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& 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 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;
    }
};

你可能感兴趣的:(补题,数据结构,c++,算法,leetcode)