系列文章目录
文章目录
前言
数据结构与算法
是计算机领域的核心,既是面试考察重点,也是优化项目性能的关键。而刷题是掌握它最有效的方式,能帮我们巩固理论、提升解题能力。我选择
LeetCode
和NowCode
作为主要刷题平台:LeetCode 题目丰富、分类清晰,适合夯实基础;NowCode贴近国内企业
笔试场景,助力对接实战需求,二者互补性强。这份刷题记录不只是题目与答案的罗列,更会记录解题思路、难点易错点,以及解法优化过程。希望它能成为我的
复盘工具
,也为其他学习者提供参考
。接下来,就从第一道题开始,在刷题中积累提升,让数据结构与算法成为解决问题的有力工具。
正文
一.移除元素
题目链接 :27.移除元素
题目描述:
题目分析 :
这道题目的意思是,给我们一个数组
和一个值val
,让我们删除
所有数组中所有等于val
的数据,并且返回剩下的元素
个数k
思路讲解 :
首先,我们最容易想到的
我们重新创建一个新数组
,遍历原数组,把所有不为val
的值放入新数组,遍历完之后,让新数组覆盖原数组
,这个方法时间和空间复杂度都是O(n)
除此之外,我们还可以用双指针
法来解决这道题目
我们可以先创建两个变量src
和dst
先都为0
如果src
所在位置元素等于val
,src++
继续向后找
如果src
所在位置元素不等val
,就把这个值赋
给dst
所在位置dst
和src
都++
由于src++
的情况更多
,所以一定是它最先走完
这时候我们dst
所在位置,就是我们的k
代码展示:
c
int removeElement(int* nums, int numsSize, int val) {
// 双指针
// 定义一个dst和src
// src找不是val的就和给dst,两个都向后
// 是,src继续向后找
int src = 0;
int dst = 0;
// src小于元素个数的时候,循环继续
while (src < numsSize) {
if (nums[src] != val) {
nums[dst++] = nums[src++];
} else {
src++;
}
}
return dst;
}
二.删除有序数组中的重复项
题目链接 :26.删除有序数组中的重复项:
题目描述:
题目分析 :
题目意思就是让我们删除
数组中重复的元素
,并且返回
删除后数组的元素个数k
思路讲解 :
同样的,我们还是可以开辟新数组
但是参考第一道题目,我们可以思考使用双指针
只不过,现在我们让src=1
,dst=0
如果dst==src
,我们src++
向后
如果dst!=src
,我们先
让dst++
向后,再
把src
赋给我们的dst
,src
再向后++
但是我们dst
可能和src
会指向同一个位置,这样赋值就多余
了,所以这种情况,我们也不赋值
但是这里最后,我们返回
的要是dst+1
代码展示:
c
int removeDuplicates(int* nums, int numsSize) {
// 方法二
// 双指针
int src = 1;
int dst = 0;
// src==dst,src++;
// src!=dst,src++赋值dst ++
while (src < numsSize) {
if (nums[src] != nums[dst] && ++dst != src) {
nums[dst] = nums[src];
}
src++;
}
return dst + 1;
}
三.合并两个有序数组
题目链接 :88.合并两个有序数组:
题目描述:
题目分析 :
这道题目让我们按照非递减
的顺序,合并
两个数组
有题目意思可以知道,其实就是合并到第一个数组
中
思路讲解 :
首先,第一个方法,我们直接把两个数组合并,然后用排序算法
排序,可是时间复杂度可能比较大
我们想第二种方法,就是从小到大
遍历·比较两个数组
的数据,直接在第一个数组上进行放置,但是这个方法会覆盖
没有比较的元素
这时候我们发现,第一个数组在原来的空间上已经给我们开辟好了n+m
个位置,我们可以反过来,从大往小去排
,这样即便我们总是放入的是第二数组数据,我们还是可以不覆盖
任何一个元素
我们先定义三个变量,分别指向下面的这三个位置
比较l1
和l2
的值,在l3
位置进行插入
当其中一个数组遍历完之后,再把剩下的元素依次插入,这样就可以实现数组的顺序合并了
代码展示:
c
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
// 依次比较两个数组中的元素大小,
// 从大往小放
int l1 = m - 1;
int l2 = n - 1;
int l3 = n + m - 1;
while (l1 >= 0 && l2 >= 0) {
// 比较
if (nums1[l1] > nums2[l2]) {
nums1[l3--] = nums1[l1--];
} else {
nums1[l3--] = nums2[l2--];
}
}
while (l2 >= 0) // l1先结束,继续放nums2的数据
{
nums1[l3--] = nums2[l2--];
}
}
总结
顺序表部分的题目,代码思维相对适中
,但是其中也不缺乏一些技巧性
的东西,我们需要勤加练习,反复理解
下一篇我会为大家带来栈和队列相关
的题目,希望大家可以多多支持,有什么问题可以评论留言或者后台私信,感谢大家