Leetcode 1~30题目选讲

1. 两数之和

这是一道简单题目,直接两重循环判断实际复杂度O(n^2), 使用HashMap优化,时间复杂度O(n)

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

这一道题目稍微有一点难度,直接穷举所有字串判断是否重复,时间复杂度是O(n^3), 可以根据字串的连续性,将时间复杂度优化到O(n^2), 使用双指针滑窗的算法,可以将时间复杂度优化到O(N)

5. 最长回文子串

这也是一道难度的题目,直接穷举所有字串,判断是不是回文,时间复杂度O(n^3)。

利用动态规化,令bool dp[i][j]表示i到j的字串是否回文串

状态方程为 dp[i-1][j+1] = true if (dp[i][j] = true and s[i-1]=s[j+1]), 时间复杂度是O(n^2)

枚举回文中心,向两边扩展,时间复杂度是O(n^2)

存在一种神级的Manacher算法时间复杂为O(N)

7. 整数反转

利用除法取余数的算法,注意整形溢出的情况,容易题

8. 字符串转换整数 (atoi)

实现c语言中的atoi函数,需要先处理字符串前面的空格,以及判断正负号,当读到非数字字符的时候结束。字符串转整形用的是乘法,同时还要注意处理溢出问题。

9. 回文数

判断一个数是否是回文数,利用整数反转的方法,但要注意防止溢出,可以完全反转用long long存储,也可以只反转一半。

12. 整数转罗马数字 / 13. 罗马数字转整数

罗马数字特殊的地方只有下面六种情况

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

所以罗马数字转整数只需要遍历一次字符串,注意六种特殊情况,其他依次转换即可

整数转罗马数字只需要把这六种情况当作一个新的数,用贪心算法处理即可。

26. 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

这是一个经典的快慢双指针算法

27. 移除元素

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

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

和上面一样,也是经典的快慢指针算法。

 

 

 

 

点赞