DailyPractice.2023.10.12

news2025/6/28 17:29:12

文章目录

  • 1.[1. 两数之和]
  • 2.[49. 字母异位词分组]
  • 3.[128. 最长连续序列]
  • 4.[283. 移动零]
  • 5.[11. 盛最多水的容器]
  • 6.[15. 三数之和]
  • 7.[3. 无重复字符的最长子串]
  • 8.[206. 反转链表]
  • 9.[141. 环形链表]
  • 10.[160. 相交链表]

1.[1. 两数之和]

1. 两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        if (nums.size() == 0) return {0,0};
        unordered_map<int,int> mp;
        for (int i = 0; i < nums.size(); i++) {
            auto it = mp.find(target - nums[i]);
            if (it != mp.end()) {
                return {it -> second,i};
            }
            mp[nums[i]] = i;
        }
        return {-1,-1};

    }
};
  • 时间复杂度: O ( N ) O(N) O(N)
  • 空间复杂度: O ( N ) O(N) O(N)

2.[49. 字母异位词分组]

49. 字母异位词分组

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        // 遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。
        // 遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。

        vector<vector<string>> res;
        unordered_map<string,vector<string>> mp;
        if (strs.size() == 0) return res;
        for (auto str : strs) {
            string key = str;
            sort(key.begin(),key.end());
            mp[key].push_back(str);
        }
        for (auto it = mp.begin(); it != mp.end(); it ++) {
            res.emplace_back(it -> second);
        }
        return res;
    }
};
  • 时间复杂度: O ( n k l o g ⁡ k ) O(nklog⁡k) O(nklogk),其中 n是 strs中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klog⁡k)的时间进行排序以及 O(1)的时间更新哈希表,因此总时间复杂度是 O(nklog⁡k)。

  • 空间复杂度: O ( n k ) O(nk) O(nk),其中 n 是 strs 中的字符串的数量,k 是 strs中的字符串的的最大长度。需要用哈希表存储全部字符串。

3.[128. 最长连续序列]

128. 最长连续序列

// 对于匹配的过程,暴力的方法是 O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(1) 的时间复杂度
// 那么怎么判断是否跳过呢?由于我们要枚举的数 x 一定是在数组中不存在前驱数x−1的,不然按照上面的分析我们会从 x−1 开始尝试匹配,因此我们每次在哈希表中检查是否存在 x−1即能判断是否需要跳过了。
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> mp;
        if (nums.size() == 0) return 0;
        for (const int& num : nums) {
            mp.insert(num);
        }
        int longest = 0;
        for (auto num : mp) {
            if (!mp.count(num - 1)) {
                int curNum = num;
                int curStreak = 1;
                while (mp.count(curNum + 1)) {
                    curNum += 1;
                    curStreak += 1;
                }
                longest = max(longest,curStreak);
            }
            
        }
        return longest;
    }
};
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 为数组的长度。具体分析已在上面正文中给出。
  • 空间复杂度: O ( n ) O(n) O(n),哈希表存储数组中所有的数需要 O ( n ) O(n) O(n)的空间。

4.[283. 移动零]

283. 移动零
两次遍历:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        if(nums.size() == 0) return;
        int fast = 0,slow = 0;
        while (fast < nums.size()) {
            if (nums[fast] != 0) {
                nums[slow ++] = nums[fast];
            }
            fast ++;
        }
        for (int i = slow; i < nums.size(); i++) {
            nums[i] = 0;
        }
       
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

一次遍历:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 注意到以下性质:
        // 左指针左边均为非零数;
        // 右指针左边直到左指针处均为零。
        // 因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
        // 非0,交换数据,左右指针都往右移
        // 0,右指针右移
        int n = nums.size(),left = 0,right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left ++],nums[right]);
            }
            right ++;
        }
    }
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

5.[11. 盛最多水的容器]

11. 盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        int i = 0,j = height.size() - 1;

        // S(i,j) = min(h[i],h[j]) * (j - i);

        // 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1 变短:
        // 因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
        int res = 0;
        while (i < j) {
            res = height[i] < height[j] ?
                max(res,(j - i) * height[i ++]) :
                 max(res,(j - i) * height[j --]);
        }
        return res;
    }
};
  • 时间复杂度: O ( N ) O(N) O(N),双指针遍历一次底边宽度 N。
  • 空间复杂度: O ( 1 ) O(1) O(1),变量 i , j , res 使用常数额外空间。

6.[15. 三数之和]

15. 三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        if (nums.size() == 0) return res;
        for (int k = 0; k < nums.size() - 2; k ++) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[ k - 1]) continue;
            int i = k + 1,j = nums.size() - 1;
            while (i < j) {
                int sum = nums[k] + nums[i] + nums[j];
                if (sum < 0) {
                    while (i < j && nums[i] == nums[++i]);
                }
                else if(sum > 0) {
                    while (i < j && nums[j] == nums[--j]);
                }
                else {
                    res.push_back(vector<int>{nums[k], nums[i], nums[j]});
                    while(i < j && nums[i] == nums[++i]);
                    while(i < j && nums[j] == nums[--j]);
                }
            }
        }
        return res;
    }
};
  • 时间复杂度: O ( N 2 ) O(N^2) O(N2),其中固定指针k循环复杂度 O ( N ) O(N) O(N),双指针 i,j 复杂度 O ( N ) O(N) O(N)
  • 空间复杂度: O ( 1 ) O(1) O(1),指针使用常数大小的额外空间。

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

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

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> dic;
        int i = -1, res = 0, len = s.size();
        for (int j = 0; j < len; j ++) {

            // 哈希表 dic 统计: 指针 j 遍历字符 s ,哈希表统计字符 s[j] 最后一次出现的索引 。
            if (dic.find(s[j]) != dic.end()) {
                i = max(i,dic.find(s[j]) -> second);
            }
            dic[s[j]] = j; // 哈希表记录
            res = max(res, j - i); // 更新结果
        }
        return res;
        //时间复杂度 O(N) : 其中 N 为字符串长度.
        //空间复杂度 O(1) : 字符的 ASCII 码范围为 000 ~ 127 ,哈希表 dic 最多使用 O(128)=O(1)大小的额外空间。

    }
};
  • 时间复杂度 O(N) : 其中 N 为字符串长度.
  • 空间复杂度 O(1) : 字符的 ASCII 码范围为 000 ~ 127 ,哈希表 dic 最多使用 O(128)=O(1)大小的额外空间。

8.[206. 反转链表]

206. 反转链表

/**
 * 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* reverseList(ListNode* head) {
        if (head == nullptr) return nullptr;
        ListNode* cur = head;
        ListNode* pre = nullptr;
        ListNode* temp = nullptr;
        while (cur) {
            temp = cur -> next;
            cur -> next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};
  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。

  • 空间复杂度:O(1)。

9.[141. 环形链表]

141. 环形链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr || head -> next == nullptr) {
            return false;
        }
        // 理解成公倍数,两个正整数一定会有一个最小公倍数,这个地方就是重合点
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast && fast -> next) {
            fast = fast -> next -> next;
            slow = slow -> next;
            if (slow == fast) 
            return true;
        }
         return false;
    }
};
  • 时间复杂度:O(N),其中 N是链表中的节点数。
    当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。
    当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 N 轮。

  • 空间复杂度:O(1)。我们只使用了两个指针的额外空间。

10.[160. 相交链表]

160. 相交链表
在这里插入图片描述
考虑构建两个节点指针 A​ , B 分别指向两链表头节点 headA , headB ,做如下操作:

指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:
a+(b−c)
指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:
b+(a−c)

如下式所示,此时指针 A , B 重合,并有两种情况:
若两链表 有 公共尾部 (即 c>0) :指针 A , B 同时指向「第一个公共节点」node 。
若两链表 无 公共尾部 (即 c=0 ) :指针 A , B 同时指向 null 。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr) return headB;
        if (headB == nullptr) return headA;
        ListNode* p1 = headA;
        ListNode* p2 = headB;
        while (p1 != p2) {
            if (p1 == nullptr) p2 = headB;
            else p1 = p1 -> next;
            if (p2 == nullptr) p1 = headA;
            else p2 = p2 -> next;
        }
        return p1;
    }
};
  • 时间复杂度 O(a+b) : 最差情况下(即 ∣a−b∣=1| , c=0 ),此时需遍历 a+b个节点。
  • 空间复杂度 O(1)) : 节点指针 A , B 使用常数大小的额外空间。

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

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

相关文章

单目标优化算法:火鹰优化算法(Fire Hawk Optimizer,FHO)求解23个函数--提供MATLAB代码

一、火鹰优化算法FHO 火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#xff09;由Mahdi Azizi等人于2022年提出&#xff0c;该算法性能高效&#xff0c;思路新颖。 单目标优化&#xff1a;火鹰优化算法&#xff08;Fire Hawk Optimizer&#xff0c;FHO&#…

使用Tortoisegit界面拉起master主分支以副分支以及命令行操作

文章目录 1、Gui操作界面2、命令行操作 1、Gui操作界面 "小乌龟"通常指的是Git的图形用户界面&#xff08;GUI&#xff09;工具&#xff0c;其中比较常见的是TortoiseGit。下面是使用TortoiseGit来拉取&#xff08;checkout&#xff09;一个Git分支的步骤&#xff1a…

数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具

数字时代的自我呈现&#xff1a;探索个人形象打造的创新工具——FaceChain深度学习模型工具 1.介绍 FaceChain是一个可以用来打造个人数字形象的深度学习模型工具。用户仅需要提供最低一张照片即可获得独属于自己的个人形象数字替身。FaceChain支持在gradio的界面中使用模型训…

机器学习(22)---信息熵、纯度、条件熵、信息增益

文章目录 1、信息熵2、信息增益3、例题分析 1、信息熵 1. 信息熵(information entropy)是度量样本集合纯度最常用的一种指标。信息的混乱程度越大&#xff0c;不确定性越大&#xff0c;信息熵越大&#xff1b;对于纯度&#xff0c;就是信息熵越大&#xff0c;纯度越低。 2. 纯度…

CSI2与CDPHY学习

注意&#xff1a;本文是基于CSI2-V3.0 spec。 其中CPHY为 V2.0 DPHY为V2.5 本文主要在packet级别介绍CSI2与对应的CDPHY&#xff0c;需要注意的是CDPHY的burst数据就是以packet为单位 1.CSI-CPHY 1.1CPHY的多lane分配与合并 csi-cphy规定至少需要一条lane用于传输视频&am…

ubuntu20.04 nerf Instant-ngp (下) 复现,自建数据集,导出mesh

参考链接 Ubuntu20.04复现instant-ngp&#xff0c;自建数据集&#xff0c;导出mesh_XINYU W的博客-CSDN博客 GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more youtube上的一个博主自建数据集 https://www.youtube.com/watch…

C++菜鸟日记1

共用体&#xff1a; #include<iostream> using namespace std; int main() {struct widge{char brand[20];int type;union id{long id_num;char id_char[20];}id_val;};widge prize;cout << "Please cin the prize.type mumber:" << endl;cin >…

01Linux基础

附件:day26–linux入门.pdf Linux是 基于Unix 的开源免费的操作系统&#xff0c;由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境。 &#xff08;程序基本上在Linux上发布&#xff09; Linux系统的应用非常广泛&#xff0c;不仅可以长时间的运行我们编写的程序代…

【C++14算法】make_unique

文章目录 前言一、make_unique函数1.1 什么是make_unique?1.2 如何使用make_unique?1.3 make_unique的函数原型如下&#xff1a;1.4 示例代码示例1: 创建一个动态分配的整数对象示例2: 创建一个动态分配的自定义类型对象示例3: 创建一个动态分配的数组对象示例4: 创建一个动态…

STM32 CubeMX PWM三种模式(互补,死区互补,普通)(HAL库)

STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09;一、互补对称输出STM32 CubeMX设置代码部分 二、带死区互补模式STM32 CubeMX设置代码 三、普通模式STM32 CubeMX设置代码部分 总结 一、互补对称输…

2023.10.12

#include <iostream>using namespace std; //定义动物类 class Animal { private:string name; public:Animal(){}Animal(string name):name(name){}~Animal(){}//定义虚函数virtual void perform()0;//表演的节目void show(){cout << "Please enjoy the spec…

平衡二叉树(AVL) 的认识与实现

文章目录 1 基本1.1 概念1.2 特点1.3 构建1.4 调整1.4.1 RR1.4.1.1 示例1.4.1.2 多棵树不平衡 1.4.2 LL1.4.2.1 示例 1.4.3 LR1.4.3.1 示例 1.4.4 RL1.4.4.1 示例 1.5 实现1.5.1 示例1.5.2 完善 1 基本 1.1 概念 平衡二叉树是一棵合理的二叉排序树 解释 对于这么一个序列 如…

2023 | github无法访问或速度慢的问题解决方案

github无法访问或速度慢的问题解决方案 前言: 最近经常遇到github无法访问, 或者访问特别慢的问题, 在搜索了一圈解决方案后, 有些不再有效了, 但是其中有几个还特别好用, 总结一下. 首选方案 直接在github.com的域名上加一个fast > githubfast.com, 访问的是与github完全相…

03-RocketMQ高级原理

目录汇总&#xff1a;RocketMQ从入门到精通汇总 上一篇&#xff1a;02-RocketMQ开发模型 前面的部分我们都是为了快速的体验RocketMQ的搭建和使用。这一部分&#xff0c;我们慢下来&#xff0c;总结并学习下RocketMQ底层的一些概念以及原理&#xff0c;为后面的深入学习做准备。…

使用宝塔面板在Linux上搭建网站,并通过内网穿透实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

4种实现JS深拷贝的方法

浅拷贝与深拷贝 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的是内存地址 。 如果不进行深拷贝&#xff0c;其中一个对象改变了对象的值&am…

使用VS2019测试cJson库

1.代码 //cJson_Test.cpp // cJson_Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream>#include <stdio.h> #include "cJSON.h"int main(void) {cJSON* cjson_test NULL;cJSON* cjson_address NULL;cJ…

深入理解强化学习——序列决策(Sequential Decision Making)

分类目录&#xff1a;《深入理解联邦学习》总目录 在本文中我们将介绍序列决策&#xff08;Sequential Decision Making&#xff09;过程中的各个过程。 智能体与环境 强化学习研究的问题是智能体与环境交互的问题&#xff0c;下图左边的智能体一直在与下图右边的环境进行交互…

springboot农机电招平台springboot37

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

【Debian】报错:su: Authentication failure

项目场景&#xff1a; 今天我重新刷了一个debian系统。 系统版本&#xff1a; # 查看系统版本 lsb_release -a 我的系统版本&#xff1a; No LSB modules are available. Distributor ID&#xff1a;Debian Description: Debian GNU/Linux 12 &#xff08;bookworm&#xff…