力扣(LeetCode)数据结构练习题

简介: 力扣(LeetCode)数据结构练习题

今天来分享两道力扣(LeetCode)的题目来巩固上篇时间复杂度和空间复杂度的知识,也就是在题目上加上了空间复杂度和时间复杂度的限制。


给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。


元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

我们注意审题发现这里要求O(1)的空间复杂度来完成,且在原地修改数组。不知道大家是否有了自己思路了呢。这道题的考点就是限制了空间复杂度和操作方式,那么有什么办法呢,下面是一种参考方法。

int removeElement(int* nums, int numsSize, int val) {
 
 
    int a=0;
    int b=0;
while(a<numsSize)
{
if(nums[a]!=val)
{
    nums[b]=nums[a];
    b++;
    a++;
}
else
{
    a++;
}
 
}
 
 
return b;
}


 

具体思路: 我们就创建两个变量作为解体的关键,其中a作为遍历数组全部的变量,不断往后遍历,知道数组的元素全部遍历完成,即a==numsSize。在此过程中只要nums数组中的元素不等于val我们就从头开始不断往后覆盖掉原来的数即可。


此解法空间复杂度位O(1),时间复杂度为O(N)。

接下来我们看第二题


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


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

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况


nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略
nums2 的长度为 n


这里我们尽量将代码弄到更优且我们试试将时间复杂度控制为O(m+n),下面给出一种参考解法:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    
int end=m+n-1;
int end1=m-1;
int end2=n-1;
while(end1>=0 && end2>=0)
{
if(nums1[end1]>nums2[end2])
{
 
    nums1[end]=nums1[end1];
    end1--;
    end--;
}
 
else
{
 
nums1[end]=nums2[end2];
end2--;
end--;
 
}
 
}
 
while(end2>=0)
{
 
nums1[end]=nums2[end2];
end--;
end2--;
 
}
 
 
}


具体思路:这里我们从题目可知我们要将nums2合并到nums1中,其中nums1的长度为m+n,那么如果我们从nums1的前面开始排序,我们就会因为排序而丢失前面nums1原来的值,所以我们就要从末尾开始排序,所以我们在代码中先定义出三个整形变量end1,end2,end,分别进行运算,进行while循环在两个数组都没比较结束到首元素时我们进行比较后放入nums1的末尾,当有一个nums1的比较元素已经到首元素时,如果nums2的元素还没比较完,那么我们就需要将nums2的元素全排在前面即可。


这里的解法空间复杂度为O(m+n),空间复杂度为O(1)


好了就分享这两道题了,这两道题主要控制时间复杂度和空间复杂度是相比以前的练习解法限制更多,锻炼我们写优质代码的能力。喜欢的话希望点个心心支持一次唔。


目录
相关文章
|
1天前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
6 0
|
1天前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
6 0
|
3月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
27 0
|
3月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
25 0
|
4月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
16天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
47 6
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
91 2
|
16天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
41 7