• 力扣刷题(简单篇):两数之和、两数相加、无重复字符的最长子串


    坚持就是胜利


    一、两数之和

    题目链接:https://leetcode.cn/problems/two-sum/

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

    你可以按任意顺序返回答案。

    示例 1:

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
    示例 2:

    输入:nums = [3,2,4], target = 6
    输出:[1,2]
    示例 3:

    输入:nums = [3,3], target = 6
    输出:[0,1]

    提示:

    2 <= nums.length <= 104
    -109 <= nums[i] <= 109
    -109 <= target <= 109
    只会存在一个有效答案

    进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

    代码©

    /**
     * Note: The returned array must be malloced, assume caller calls free().
     */
    int* twoSum(int* nums, int numsSize, int target, int* returnSize){
        for(int i = 0;i < numsSize;i++)
        {
            for(int j = i+1;j < numsSize;j++)
            {
                if(nums[i]+nums[j] == target)
                {
                    int* ret = malloc(sizeof(int) * 2);
                    ret[0] = i, ret[1] = j;
                    *returnSize = 2;
                    return ret;
                }
            }
        }
    
       *returnSize = 0;
        return NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    二、两数相加

    题目链接:https://leetcode.cn/problems/add-two-numbers/

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例 1:
    在这里插入图片描述

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    示例 2:

    输入:l1 = [0], l2 = [0]
    输出:[0]
    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    输出:[8,9,9,9,0,0,0,1]

    提示:

    每个链表中的节点数在范围 [1, 100] 内
    0 <= Node.val <= 9
    题目数据保证列表表示的数字不含前导

    代码©

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    
    struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
        struct ListNode *head = NULL, *tail = NULL;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            if (!head) {
                head = tail = malloc(sizeof(struct ListNode));
                tail->val = sum % 10;
                tail->next = NULL;
            } else {
                tail->next = malloc(sizeof(struct ListNode));
                tail->next->val = sum % 10;
                tail = tail->next;
                tail->next = NULL;
            }
            carry = sum / 10;
            if (l1) {
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }
        if (carry > 0) {
            tail->next = malloc(sizeof(struct ListNode));
            tail->next->val = carry;
            tail->next->next = NULL;
        }
        return head;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    三、无重复字符的最长子串

    题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: s = “abcabcbb”
    输出: 3
    解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
    示例 2:

    输入: s = “bbbbb”
    输出: 1
    解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
    示例 3:

    输入: s = “pwwkew”
    输出: 3
    解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

    提示:

    0 <= s.length <= 5 * 104
    s 由英文字母、数字、符号和空格组成

    代码©

    int lengthOfLongestSubstring(char * s)
    {
        //类似于hash的思想
        //滑动窗口维护
        int left = 0;
        int right = 0;
        int max = 0;
        int i,j;
        int len = strlen(s);
        int haveSameChar = 0;
        for(i =0; i < len ; i++  )
        {
            if(left <= right)
            {   
                //检测是否出现重复
                 //循环遍历整个数组 left -> right
                haveSameChar = 0;
                for(j = left; j < right ; j++)
                {
                    if(s[j] == s[right])
                    {
                        haveSameChar = 1;
                        break;
                    }
                }
                if(haveSameChar)
                {
                    //指向下一个
                    left = j +1;
                }
            }
            //统计最大的间距
            max = max < (right - left + 1) ? (right - left + 1): max;
            right++;
        }
        return max;
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    Centos7 部署Prometheus(Kubernetes)
    ROS - launch文件
    大数据:HDFS的Shell常用命令操作
    中低压MOSFET 2N7002T 60V 300mA 双N通道 SOT-523封装
    2023年“绿盟杯”四川省大学生信息安全技术大赛
    Rust生态系统:探索常用的库和框架
    使用 FFmpeg 将视频转换为 GIF 动画的技巧
    c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)
    【Window10 】删除‘设备和驱动器’中的百度网盘、酷狗音乐、迅雷下载等
    前端是leyui后端sqlserver和maraDB进行分页
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/132968464