leedcode刷题 | 详细注释 | 调用+调试 C++

news2024/11/17 1:39:18

目录

  • 1.两数之和
    • 题目
    • C++代码
  • 2.两数相加
    • 题目
    • 代码
  • 3. 无重复字符的最长子串
    • 题目:
    • 代码:
  • 4. 合并两个有序数组
    • 题目:
    • 代码:
  • 5.寻找两个正序数组的中位数
    • 题目:
    • 代码:

1.两数之和

题目

给定一个整数数组 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
只会存在一个有效答案

C++代码

vector容器 见C++相关博客

vector<int> twoSum(vector<int>& nums, int target) {
	unordered_map<int, int> hashtable;
	for (int i = 0; i < nums.size(); i++)
	{
		// 在哈希表中找 target-num[i]
		// unordered_map<int,int>::iterator 可以用auto代替这一串冗长的代码
		auto it = hashtable.find(target - nums[i]);
		// 如果找到
		if (it != hashtable.end()) {
			// it->first指的是key,it->second指的是value
			return { it->second, i };
		}
		// 如果找不到
		hashtable[nums[i]] = i;
	}
	return {};
}

调试+调用

由于考研复试需要,无奈从Python转为C++,所有的代码操作都不熟悉,现将相关调试代码记录如下

int main() {
	vector<int> nums;
	vector<int> res;
	for (int i = 0; i < 4; i++)
	{
		int a;
		cin >> a;
		nums.push_back(a);
	}
	int target;
	cin >> target;
	//函数调用
	res = twoSum(nums, target);
	//遍历容器
	for (vector<int>::iterator it = res.begin(); it != res.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

2.两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述

输入: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]

代码

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* head = nullptr, * tail = nullptr;
    // 进位初始变量为0
    int carry = 0;
    while (l1 || l2) {
        // 如果L1不为空,n1就为L1的第一个元素
        // 也就是说  个位数先相加   L2类似
        int n1 = l1 ? l1->val : 0;
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + carry;
        // 如果 head 为空指针
        if (!head) {
            head = tail = new ListNode(sum % 10);
        }
        // 如果 head 不是空指针
        else {
            tail->next = new ListNode(sum % 10);
            tail = tail->next;
        }
        // 若sum>10 则进位为1
        carry = sum / 10;
        // L1 和 L2若存在其他位,向后移位
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    // 若最高位加完时,还有进位,那么新增一个最高位值为1 (即carry)
    if (carry > 0) {
        tail->next = new ListNode(carry);
    }
    return head;
}

3. 无重复字符的最长子串

题目:

示例 1:

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

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

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

代码:

s.substr(i, rk - i + 1)
第一个参数是从i开始截取,第二个参数是截取几个元素

int lengthOfLongestSubstring(string s) {
    // 哈希集合,记录每个字符是否出现过
    unordered_set<char> occ;
    int n = s.size();
    // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
    int rk = -1, ans = 0;
    // 枚举左指针的位置,初始值隐性地表示为 -1
    for (int i = 0; i < n; ++i) {
        if (i != 0) {
            // 左指针向右移动一格,移除一个字符
            occ.erase(s[i - 1]);
        }
        // occ.count 存在该元素返回1,不存在该元素返回0
        while (rk + 1 < n && !occ.count(s[rk + 1])) {
            // 不断地移动右指针
            occ.insert(s[rk + 1]);
            rk++;
        }
        // 第 i 到 rk 个字符是一个极长的无重复字符子串
        cout << s.substr(i, rk - i + 1)<<'\n';
        ans = max(ans, rk - i + 1);
    }
    return ans;
}

int main() {
    string str = "abcabcbb";
    cout << lengthOfLongestSubstring(str);
}

4. 合并两个有序数组

本题是第五题的铺垫
代码参考王道考研教材

题目:

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

代码:

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    // K是sorted 数组的指针
    int p1 = 0, p2 = 0,k = 0;
    int *sorted = new int[m+n];
    // 若p1和p2都没有到数组末尾
    while (p1 < m && p2 < n) {
        if (nums1[p1] <= nums2[p2]) {
            sorted[k++] = nums1[p1++];
        }
        else {
            sorted[k++] = nums2[p2++];
        }
    }
    // 若P1还没有结束
    while (p1 < m) {
        sorted[k++] = nums1[p1++];
    }
    // 若P2还没有结束
    while (p2 < n) {
        sorted[k++] = nums2[p2++];
    }
    // 复制整个数组给nums1,并返回
    for (int i = 0; i != m + n; ++i) {
        nums1[i] = sorted[i];
    }
}

测试:

int main() {
    
    vector<int> a = { 1,2,3,0,0,0 };
    int m = 3;
    vector<int> b = { 2,5,6 };
    int n = 3;
    merge(a, m, b, n);
    for (int i = 0; i < a.size(); i++) {
        cout << a[i] <<" ";
    }
}

5.寻找两个正序数组的中位数

本题(log (m+n))时间复杂度的代码思路太难想了,出于应试考虑,修改了上题的一部分代码,时间复杂度达到了(m+n)/2

题目:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

代码:

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int p1 = 0, p2 = 0,k = 0,num;
    int m = nums1.size();
    int n = nums2.size();

    int* sorted = new int[m + n];

    num = (m + n) / 2;
    // 如果是偶数
    if ((m + n) % 2 == 0) {
        while (p1 < m && p2 < n && k <= num) {
            if (nums1[p1] <= nums2[p2]) {
                sorted[k++] = nums1[p1++];
            }
            else {
                sorted[k++] = nums2[p2++];
            }

        }
        while (p1 < m && k <= num) {
            sorted[k++] = nums1[p1++];
        }
        while (p2 < n && k <= num) {
            sorted[k++] = nums2[p2++];
        }
        double medium = double(sorted[k - 1] + sorted[k - 2]) / 2;
        return medium;
    }
    // 如果是奇数
    else
    {
        while (p1 < m && p2 < n && k <= num) {
            if (nums1[p1] <= nums2[p2]) {
                sorted[k++] = nums1[p1++];
            }
            else {
                sorted[k++] = nums2[p2++];
            }

        }
        while (p1 < m && k <= num) {
            sorted[k++] = nums1[p1++];
        }
        while (p2 < n && k <= num) {
            sorted[k++] = nums2[p2++];
        }
        double medium = double(sorted[k - 1]);
        return medium;
    }
}

测试:

int main() {
    vector<int> a = { 1,3,5 };
    vector<int> b = { 2,4,6,7 };  
    double res;
    res = findMedianSortedArrays(a, b);
    cout << res << "\n";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API 网关策略的二三事

作者暴渊&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer。 近些年随着云原生和微服务架构的日趋发展&#xff0c;API 网关以流量入口的角色在技术架构中扮演着越来越重要的作用。API 网关主要负责接收所有请求的流量并进行处理转发至上游服务&#xff0c;…

说一说JVM的垃圾回收器

垃圾回收器1.Serial收集器2.parnew收集器3 .parallel Scavenge收集器4.Serial Old5.parallel old收集器6.cms7. G1 收集器串行&#xff1a;指的是垃圾回收器与用户线程交替进行&#xff0c;这意味着在垃圾回收器执行的时候用户线程需要暂停工作 并行&#xff1a;指的是垃圾回收…

网络知识详解之:CA证书制作实战(Nginx数字证书实战)

网络知识详解之&#xff1a;CA证书制作实战 计算机网络相关知识体系详解 网络知识详解之&#xff1a;TCP连接原理详解网络知识详解之&#xff1a;HTTP协议基础网络知识详解之&#xff1a;HTTPS通信原理剖析&#xff08;对称、非对称加密、数字签名、数字证书&#xff09;网络…

Oracle的学习心得和知识总结(九)|Oracle数据库PL/SQL语言条件选择语句之IF和CASE语句技术详解

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Guid…

[Lua实战]整理Lua中忽略的问题

整理Lua中忽略的问题1.元表metatable和元方法1.1元方法_index可以设置为table1.2.元方法_index可以设置为函数1.3.元方法_index和_newindex实现只读table2.Lua强制GC方法2.1 collectgarbage()3.协程和线程的区别3.1协程coroutine.create()是同步执行,不是并行,只是切了一个上下…

Day874.MySQL索引选择出错问题 -MySQL实战

MySQL索引选择出错问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySQL索引选择出错问题的内容。 写 SQL 语句的时候&#xff0c;并没有主动指定使用哪个索引。也就是说&#xff0c;使用哪个索引是由 MySQL 来确定的。 不知道有没有碰到过这种情况&#xff0…

Android开发进阶—invoke反射及其原理解析

反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且…

含有吲哚基团132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;132557-72-3中文名&#xff1a;2,3,3-三甲基-3H-吲哚-5-磺酸&#xff0c;2,3,3-三甲基-3H-吲哚-6-磺酸钾盐英文名&#xff1a;5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0…

Axure原型图设计工具使用记录

Axure原型图设计工具使用记录 Axure快速入门&#xff08;01&#xff09; - 面板介绍 https://blog.51cto.com/u_15294985/3007677 Axure快速入门&#xff08;02&#xff09; - 入门例子&#xff08;登录案例&#xff09; https://developer.aliyun.com/article/1046689 Axu…

03 python 要点(函数+类)

第8章 函数 8.1 定义函数 函数就是执行特定任务的一段代码, 自定义函数的语法格式, 以英文半角冒号结尾. # def: 8.2 调用函数 在定义好函数后&#xff0c;既可调用函数. 8.2.1 使用位置参数调用函数 在调用函数时传递的实参与定义函数时的形参顺序一致&#xff0c;这…

LoongArch上正常使用`pip install`

原创&#xff1a;你在使用loongarch架构操作系统时&#xff0c;是否遇到pip install 安装失败的情况&#xff1f; 刷到这篇文章&#xff0c;大家可添加评论或者私信我&#xff0c;及时满足大家的需求那么&#xff0c;下面讲一下如何配置loongarch架构的pip 仓库及开发原理如何配…

Java集合(五)LinkedList底层扩容源码分析

LinkedList的全面说明&#xff1a; &#xff08;1&#xff09;LinkedList底层实现了双向链表和双端队列特点 &#xff08;2&#xff09;可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括null. (3)线程不安全&#xff0c;没有实现同步 LinkedList的底…

MicroBlaze系列教程(1):AXI_GPIO的使用

文章目录 @[toc]简介常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第1篇文章。 简介 AXI GPIO是基于AXI-lite总线的一个通用输入输出IP核,可配置为一个或两个通道,每个通道32位,每一位可以通过SDK动态配置成输入或输出方向,支持中断请求,配合中断控…

计算机网络第三章 传输层

本文部分图片&#xff08;PPT截图&#xff09;来自中科大计算机网络top down3.0 目录[TOC]3.1 概述传输层TCP和UDP协议可以在IP协议主机到主机通信的基础上&#xff0c;实现进程到进程之间的通信&#xff08;利用端口号&#xff09;真正实现端到端的通信【通过多路复用于解复用…

b站黑马Vue2后台管理项目笔记——(3)用户列表

说明&#xff1a; 此项目中使用的是本地SQL数据库&#xff0c;Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图&#xff1a; 三.用户列表的开发 目标效果&#xff1a; 点击二级菜单——用户列表&#xff0c;在右侧展示用户列表对应的内容&#xf…

羊了个羊,低配纯前端实现,代码开源

各位朋友们大家好&#xff0c;我是克隆窝。 我属实被“羊了个羊”气到了&#xff0c;就是通不过第二关&#xff0c;迫不得已自己弄了个网页版的“鱼了个鱼” 游戏的玩法非常简单&#xff0c;类似 “消消乐”&#xff0c;从一堆方块中找到相同图案的 3 个方块并消除即可。 文末…

火山引擎边缘计算在云边协同方面的探索与实践

作者&#xff1a;杜怀宇近期&#xff0c;由边缘计算产业联盟&#xff08;ECC&#xff09;主办的2022边缘计算产业峰会&#xff08;ECIS2022&#xff09;以云端直播形式成功举办&#xff0c;峰会以“边云智联 助力行业数字化转型”为主题&#xff0c;汇聚来自全球的商业领袖、国…

JavaScript基础复盘1

JS有三种书写位置&#xff0c;分别为行内&#xff0c;内嵌和外部。 注意&#xff0c;引用外部JS文件&#xff0c;script双标签内部不可以写代码了。 JavaScript输入输出语句 变量 变量的使用 变量再使用时分为两步&#xff1a;1.声明变量 2.赋值 实现用JavaScript接受用户输入…

最近公共祖先

最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;LCA&#xff09; 指两个点的公共祖先中&#xff0c;离根最远/深度最深的 性质&#xff1a; 1.LCA({u})uLCA\left(\left\{u\right\}\right) uLCA({u})u 2.若uuu是vvv的祖先&#xff0c;当且仅当LCA(u,v)uLCA\left(…

[Lua实战]Skynet-1.如何启动(linux环境启动)[开箱可用]

Skynet-如何启动1.依赖环境:可登录&联网的linux(Centos7)系统(可以是虚拟机)2.yum安装依赖库3.git clone skynet项目4.编译skynet4.1有可能遇到的错误(升级gcc到4.9以上即可解决):5.测试运行skynet6.运行结果最近用到了lua,想了解下云风大神的skynet,在网上看了半天也没入门…