首页 > 其他分享 >2023-03-07 leetcode写题记录

2023-03-07 leetcode写题记录

时间:2024-03-07 21:16:02浏览次数:15  
标签:03 head ListNode 07 nullptr next 链表 写题 return

2023-03-07 leetcode写题记录

目录

复健中,第一次重新写链表题。写链表题需要注意下面这些事项:

  1. 写链表时,可以把链表理解成一个数,只不过这个数有特殊含义,代表着一个地址;
  2. "->"是对地址对应的对象进行的操作;
  3. 在写函数时,指针也有是否引用之分(按一个数去理解就好理解了)。

148. 排序链表

题目链接

148. 排序链表

题意

给你链表的头结点head,请将其按升序排列并返回排序后的链表。

链表定义如下:

/**
 * 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) {}
 * };
 */

解法

归并排序

可以自底向上归并排序,这样可以做到空间复杂度为\(O(1)\),时间复杂度\(O(nlogn)\)。先把各个点都分隔开,即把next值都置为nullptr,然后分层按大小顺序安排next即可。

class Solution {
   public:
    ListNode* sortList(ListNode* head) {
        if (head == nullptr) return head;
        int n = 0;
        ListNode* tmp = head;
        while (tmp != nullptr) {
            n++;
            tmp = tmp->next;
        }
        ListNode *l = head, *r = head, *ll = l;
        for (int i = 1; i <= n / 2 - 1; ++i) r = r->next, ll = ll->next;
        r = r->next;
        ll->next = nullptr;
        if (n == 1) return head;
        l = sortList(l);
        r = sortList(r);
        ListNode *last = nullptr;
        while (l != nullptr || r != nullptr) {
            if (last == nullptr) {
                fun1(last, pd(l, r));
                tmp = last;
                continue;
            }
            fun2(last, pd(l, r));
        }
        return tmp;
    }

    // 把x变成y,y变成下一个点的地址
    void fun1(ListNode*& x, ListNode*& y) {
        x = y;
        y = y->next;
    }

    // 让x变成y,再把x变成y,y变成下一个点的地址
    void fun2(ListNode*& x, ListNode*& y) {
        x->next = y;
        fun1(x, y);
    }

    // 判断当前x该变成哪个值
    ListNode*& pd(ListNode*& x, ListNode*& y) {
        if (x == nullptr || (y != nullptr && x->val > y->val)) return y;
        return x;
    }
};

56. 合并区间

题目链接

56. 合并区间

题意

以数组\(intervals\)表示若干个区间的集合,其中单个区间为\(intervals[i] = [start_i, end_i]\)。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

解法

class Solution {
   public:
    vector<vector<int>> merge(vector<vector<int>>& a) {
        sort(a.begin(), a.end(), [](vector<int>& x, vector<int>& y) {
            return x[0] < y[0] || (x[0] == y[0] && x[1] < y[1]);
        });
        vector<vector<int>> ans;
        for (vector<int>& x : a)
            if (ans.empty() || ans.back()[1] < x[0])
                ans.push_back(x);
            else
                ans.back()[1] = max(ans.back()[1], x[1]);
        return ans;
    }
};

标签:03,head,ListNode,07,nullptr,next,链表,写题,return
From: https://www.cnblogs.com/FlyingLight/p/18059474

相关文章

  • 2024.03.07
     第三天所花时间(包括上课)1h代码量(行)56行博客量(篇)1篇了解到的知识点AndroidStudio的数据库简单查询操作,复习昨天的增删改操作          今天进行了AndroidStudio对数据库的查询操作,进行了最基本的查询操作,以及在虚拟机上进行输出......
  • 2024-03-07
    2024-03-07做题埃及分数迭代加深搜索两层迭代:单位分数的个数\(depth\)和最大的分母\(mxs\)推枚举的当前分母\(p\)的上下界:\(\frac{1}{p}\le\frac{a}{b}\)即\(p\ge\frac{b}{a}\)每一个单位分母不相同,所以\(p\gelast\)要在后面\(depth-k+1\)个分数凑出当......
  • 20240307正则表达式对常见字段的校验
    验证固话号码//表示以0开头,后跟2到3位数字,然后是-,最后是7到8位数字。publicstaticbooleancheckPhoneNumber(StringphoneNumber){if(StringUtils.isEmpty(phoneNumber)){returnfalse;}Patternpattern=Pattern.co......
  • 3121000389
    这个作业属于哪个课程软件工程2024-双学位(广东工业大学)这个作业要求在哪里软件工程第一次作业这个作业的目标建立个人技术博客加入博客园班级学习使用Markdown文本语法撰写博客准备一个GitCode账号、上传代码其他参考文献无目录一、评估当前的自己简历......
  • day57 动态规划part14 代码随想录算法训练营 1035. 不相交的线
    题目:1035.不相交的线我的感悟:换汤不换药理解难点:换了个壳子听课笔记:多理解这个题意我的代码:classSolution:defmaxUncrossedLines(self,nums1:List[int],nums2:List[int])->int:#因为强调顺序,所以跟1143最长公共子序列是一样的dp......
  • P8058 [BalkanOI2003] Farey 序列 题解
    分析考虑二分答案。对于当前二分的答案\(x\),设\(cnt\)表示Farey序列中\(\frac{p}{q}\lex\)的满足条件的数量。对于一组\((i,j)\),若\(\frac{j}{i}\lex\),则\(j\le\lfloori\timesx\rfloor\)。得到暴力式子:\[cnt=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{\lfloo......
  • CF38E Let's Go Rolling! 题解
    分析考虑DP。因为\(n\le3000\),我们可以直接枚举插针的位置。定义状态函数\(f_i\)表示在从左往右第\(i\)个小球的位置上插针的最小花费。枚举该小球右边第一个插针的位置,则\(i\)到\(j-1\)的小球都会滚到小球\(i\)的位置。代价为\(\sum\limits_{k=i}^{j-1}x_k-x_i......
  • P6390 [COCI2007-2008#4] POKLON 题解
    感谢@\(\color{#AEF}{\texttt{CelestialCyan}}\)大神对我的骚扰帮助。分析一眼DP。对于求最大满足条件区间数,我们定义状态函数\(\mathit{f}_{i}\)表示在第\(1\)到\(i\)个区间中选择,且必选第\(i\)个区间能够得到的最大长度。有转移方程:\(\mathit{f}_{i}=\max\{f[j]|......
  • P1503 鬼子进村 题解
    分析分块。我们定义\(\mathit{cnt}_i\)表示房子\(i\)是否出现过,\(\mathit{sum}_i\)表示在第\(i\)个块内没有被摧毁的房子数量,维护的房子是\((i-1)\timesS-1\)到\(i\timesS\),其中\(S=\sqrt{n}\)也就是块长。操作\(1\)。写一个栈,根据后进先出的特点,讲摧毁的房子......
  • CF1070C Cloud Computing 题解
    分析思路不难想,我们对于第\(i\)个计划的时间,可以分成\(l\)和\(r+1\)两部分。用权值线段树维护,在第\(l\)天的时候就将该计划的内容加入权值线段树中,直到过了该计划的时间,也就是第\(r+1\)天,再将这个计划的内容删除。把每一天需要修改的内容存进vector中,修改完查询权值......