LeetCode刷题笔记

简介: LeetCode刷题笔记

LeetCode1.两数之和

两数之和梦开始的地方,让我们开始追逐自己的梦想吧!

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i=0,j=0;
        int len=nums.size();
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                if(nums[i]+nums[j]==target){
                    return {i,j};
                }
            }
        }
            return {i,j};
    }
};

 LeetCode2.两数相加

/**
 * 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* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode;   //建立头结点
        ListNode* head_list=head;      //往后移动的指针
        bool flage=false;              //标记是否进位
        while(l1 || l2 || flage){
            short int sum=0;
            sum+=(l1?l1->val:0);
            sum+=(l2?l2->val:0);
            if(flage) sum+=1;
            if(sum>=10) {
                sum-=10;
                flage=true;
            }else{
                flage=false;
            }
            ListNode* node=new ListNode(sum,nullptr); 
            head_list->next=node;
            head_list=node;
            if(l1)l1=l1->next;
            if(l2)l2=l2->next;
        }
        return head->next;
    }
};

首先节点范围是[1,100],因此不能完全转化为数组类型。

思路:

1.两个链表对应位相加,短的在末尾补0

2.当相加大于10时,取个位数存到该节点,并且进位1

 

 

  LeetCode1171.链表删除和为0的连续节点

/**
 * 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* removeZeroSumSublists(ListNode* head) {
        ListNode* new_head=new ListNode(0,head);  
        unordered_map<int, ListNode*>arr_sum;   //STL库
        int sum=0;
        for(ListNode* node=new_head;node;node=node->next){
            sum+=node->val;
            arr_sum[sum]=node;
            //sum从0开始
        }
        sum=0;
        for(ListNode* node=new_head;node;node=node->next){
            sum+=node->val;
            node->next=arr_sum[sum]->next;
        }
        return new_head->next;
    }
};

       给你一个链表的头节点 head,反复删去链表中总和值为 0 的连续节点组成的序列。建立一个 new_head 节点,指向 head,节点值为 0。遍历一遍链表,同时记录前缀和,以当前前缀和为 key,当前节点为,存入哈希表中。如果相同前缀和已经存在,就可以直接覆盖掉原有节点。

       第二遍重新遍历链表,同时记录前缀和 sum,哈希表中对应 sum 的节点是最后一次出现相同前缀和的节点,我们将这个节点的下一个节点,赋值给当前节点的下一个节点,中间跳过的部分总和即为 0。最后我们返回  new_head 节点的下一节点作为新的头节点。注意满足题目要求的答案不唯一,可以返回任何满足题目要求的答案。

       简单来说就是,在原来链表基础上,头部添加0,利用前缀和的性质,前轴和相同时,两者之间的和为0(包括后一个);跳过这部分即可;

相关文章
|
4天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
4天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
9 0
|
4天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
21 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
4天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
4天前
|
存储 算法 测试技术
|
4天前
|
算法 C语言 C++
|
存储 算法 C语言
C语言刷题~Leetcode与牛客网简单题
C语言刷题~Leetcode与牛客网简单题
|
21天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
13 0
|
21天前
|
Java
刷题之Leetcode19题(超级详细)
刷题之Leetcode19题(超级详细)
14 0