DailyPractice.2023.10.12

2023-10-12 22:12
文章标签 10.12 dailypractice.2023

本文主要是介绍DailyPractice.2023.10.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 使用常数大小的额外空间。

这篇关于DailyPractice.2023.10.12的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/198804

相关文章

10.12下cocoapods无法生成workspace的解决方案

前一段时间把mac的硬盘更换且重装系统之后,发现pod install命令无法生成workspace文件了。 经过反复实践终于发现了问题,由于Mac os 10.11之后系统启用了SIP(System Integrity Protection), 导致root用户也没有权限修改/usr/bin目录。按如下方式可恢复权限。 屏蔽方法:重启Mac,按住command+R,进入recovery模式。

Mac 10.12.6 源码编译安装 php7.4.4

下载 https://www.php.net/downloads configure 核心配置选项请参考这里 ./configure --prefix=/usr/local/php/7.4.4 \--with-config-file-path=/usr/local/php/7.4.4/etc \--with-config-file-scan-dir=/usr/local/php/

快乐能校正心灵的视力(10.12)

快乐是身心的愉悦,是情绪的欢畅,是生活中最美好的享受,是生命中神奇而又美妙的一种积极向上的力量。快乐的力量,会在平凡的工作中铸就辉煌;快乐的力量,会让人们在寒冬里看到春光;快乐的力量,会让人们在病痛中看到健康;快乐的力量,会感染别人,让别人也像自己那样快乐。 快乐像一副眼镜,可以校正心灵的视力。诗人曼殊写道:“在快乐的日子里,我们也比较聪明。” 重要的是抓住今天的快乐。 明天是另一个今天,如

C++ //练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。

C++ Primer(第5版) 练习 10.17 练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。 环境:Linux Ubuntu(云服务器) 工具:vim   代码块 /*************************************************************

MacOS 10.12.6 跑分测试

MacOS 10.12.6 跑分测试

黑苹果NVIDIA显卡驱动程序【 WebDriver-378.05.05.05f02+支持 macOS 10.12.4 Sierra (16E195)版本】

黑苹果NVIDIA显卡驱动程序 【 WebDriver-378.05.05.05f02+支持 macOS 10.12.4 Sierra (16E195)版本】 驱动下载地址:http://www.5yao.vip/OBJS8

与 macOS 10.12 兼容的OpenCV版本

macOS 10.12 下使用pip install opencv-python安装OpenCV后会报错,主要是版本兼容问题。不想折腾macOS,可以安装 3.4.9.33 这个版本的OpenCV这个兼容版本。

如果在 macOS 10.12 上没有任何来源 应该如何操作?

打开终端输入 sudo spctl --master-disable 即可 不显示任何来源 输入 sudo spctl --master-enable

《javascript高级程序设计》学习笔记 | 10.12-10.13.递归

关注[前端小讴],原创技术文章 相关代码 → 10.12 递归 递归函数是一个函数通过名称调用自己 function factorial(num) {if (num <= 1) {return 1} else {return num * factorial(num - 1)}} 函数逻辑与函数名是藕和的,因此将递归函数赋值给其他变量,并解除原函数名与函数之间的关系后,会报错

10.12 新一波高能胡策题 贪心+状压DP+分块+魔性DP

出题人Problem 1 零花钱 题目来源题目描述题解代码 Problem 2 Oh My King 题目来源题目描述题解代码 Problem 3 函数求和 题目来源题目描述 Problem 4 防 AK 好题 题目来源题目描述 出题人 (排名为字典序) Chairman http://blog.csdn.net/qq_36693514 LXT http://blog.