周赛总结--LeetCode单周赛321场 && AcWing79场

1. LeetCode单周赛321场

1.1 找出中枢整数

1.1.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/find-the-pivot-integer/

1.1.2 解题思路:

        1、先保存 1-n 的和sum;

        2、从 1 开始枚举,判断前 i 项和 cmp 与 sum - cmp + i 是否相等即可。

1.1.3 代码:

class Solution {
public:
    int pivotInteger(int n) {
        int sum = 0;
        for(int i = 1; i <= n; i ++ ) sum += i;
        
        int cmp = 0;
        for(int i = 1; i <= n ;i ++ ) {
            cmp += i;
            if(cmp == (sum - cmp + i)) return i;
        }
        
        return -1;
    }
};

1.2 追加字符以获得子序列

1.2.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/append-characters-to-string-to-make-subsequence/

1.2.2 解题思路:

        用双指针来判断是否存在一个 s 中的子序列等于 t,若不存在则当前枚举到 t 中剩下的字母都是需要追加到字母。

1.2.3 代码:

class Solution {
public:
    int appendCharacters(string s, string t) {
        int n = t.size();
        int m = s.size();
        
        int idx = 0;
        for(int i = 0, j = 0; j < m; j ++) {
            if(t[i] == s[j]) {
                i ++;
                idx = i;
            }

            while(t[i] != s[j] && j < m) j ++;
            if(t[i] == s[j]) {
                i ++;
                idx = i;
            }
        }

        int res = n - idx;
        if(res < 0) return 0;
        else return res;
    }
};

1.3 从链表中移除节点

1.3.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/remove-nodes-from-linked-list/

1.3.2 解题思路:

        具体思路见代码。

1.3.3 代码:

/**
 * 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) {
        if(head == nullptr) return head;//如果head为空直接return就好了
        
        ListNode* res = removeNodes(head->next);//递归处理返回的链表头一定是最大值
        if(res == nullptr) return head;
        if(res->val > head->val) return res; //删除头节点
        head->next = res;   //不删除头节点 
        
        return head;
    }
};

1.4 统计中位数为K的子数组

1.4.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/count-subarrays-with-median-k/

1.4.2 解题思路:

        1、转换为数学式子;

        2、在奇数长度下的情况:

                (1)统计K左侧的数的个数sum1,K右侧的数的个数sum2,必然有sum1 == sum2;

                (2)由(1)知:左侧小于K的数的个数 + 右侧小于K的数的个数 == 左侧大于K的数的  个数 + 右侧大于K的数的个数;

                (3)由(2)知:左侧小于K的数的个数 - 左侧大于K的数的个数 ==  右侧大于K的数的个数 - 右侧小于K的数的个数;将 “ - ”看作是 -1, “+”看作是 +1,例如:

         3、找左右匹配的数对,如上图;

        4、对于偶数个的情况:左侧小于K的数的个数 - 左侧大于K的数的个数  + 1 ==  右侧大于K的数的个数 - 右侧小于K的数的个数。

1.4.3 代码:

class Solution {
public:
    int countSubarrays(vector<int>& nums, int k) {
        //存k的下标
        int pos = find(nums.begin(), nums.end(), k) - nums.begin(), n = nums.size();
        unordered_map<int, int> cnt;
        cnt[0] = 1;
        for(int i =pos + 1, c = 0; i < n; i ++ ) {
            c += nums[i] > k ? 1 : -1;
            ++ cnt[c];
        }

        int ans = cnt[0] + cnt[1];
        for(int i = pos - 1, c = 0; i >= 0; i --) {
            c += nums[i] < k ? 1 : -1;
            ans += cnt[c] + cnt[c + 1];
        }

        return ans;
    }
};

2.AcWing周赛79场

2.1 数列元素

2.1.1 原题链接:4722. 数列元素 - AcWing题库

2.1.2 解题思路:

        预处理前缀和,再从前往后遍历找到相等情况并输出YES,找不到则输出NO。

2.1.3 代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 510;

int s[N];

int main()
{
    int n;
    cin >> n;
    
    for(int i = 1; i <= N; i ++ ) s[i] = s[i - 1] + i;
    
    bool flag = false;
    for(int i = 1; i <= N; i ++ ) {
        if(s[i] == n) flag = true;
    }
    
    if(flag) puts("YES");
    else puts("NO");
    
    return 0;
}

2.2 队列

2.2.1 原题链接:4723. 队列 - AcWing题库

2.2.2 解题思路:

        1、先判断 n 属于哪个区间;

        2、再判断 n 属于第几个元素。

2.2.3 代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    int s = 0, k = 5;
    while(s + k < n) {
        s += k;
        k *= 2;
    }
    
    n -= s;
    int len = k / 5;
    int t = (n + len - 1) / len;
    
    cout << (char) (t - 1 + 'a') << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用LeetCode,您可以按照以下步骤进行操作: 1. 首先,您需要访问LeetCode的网站或下载LeetCode的手机应用程序。 2. 注册或登录您的LeetCode账号。 3. 浏览LeetCode的题库,选择您感兴趣的算法问题。您可以使用搜索功能来查找特定的问题,或者按标签进行筛选。 4. 点击选定的问题,进入问题的详细描述页面。在左侧是问题的描述,右侧是代码编辑区。 5. 您可以选择您喜欢的编程语言,在右上角的代码编辑区顶部进行选择。 6. 在代码编辑区中,根据问题的要求编写解决方案。您可以根据需要编辑测试用例、执行代码等。 7. 在代码编辑区下方,您可以找到提交按钮。在您完成编写代码后,点击提交按钮将您的解决方案提交给LeetCode平台。 8. LeetCode将对您的代码进行评测,并给出相应的运行结果和反馈信息。您可以根据评测结果进行调试和优化,直到您的代码通过所有的测试用例。 请注意,LeetCode还提供了周赛等各种活动和功能,您可以根据需要进行参与和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode答案-rust-leetcode:leetcode用Rust回答](https://download.csdn.net/download/weixin_38707217/19920669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeetCode的使用方法](https://blog.csdn.net/yumuing/article/details/122389733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值