Leetcode 探索

Leetcode 探索之数组和字符串

[toc]

数据和字符串小结

  1. 数组可以简单的分为一维数组和多维数组。其中,字符串可以看作是字符组成的数组。
  2. 数组中的元素在内存中的分配是连续的, 因此可以根据索引快速的读取数组中的元素,随机访问的时间复杂度为O(1), 插入和删除操作由于需要移动其他的元素,时间复杂度为O(n)。
  3. 对于查找数组中的元素,遍历的时间复杂度为O(n),二分查找的时间复杂度为O(log n),因此当题目中提到有序时考虑二分查找。

做题小结

  1. 注意题目中恒定不变的量,例如数组的总和(见724),利用这些信息可以方便的计算出某些需要的值。
  2. 字符串在某些语言中是不可变的,如Java,Python,在另外一些语言中是可变的,如C++。

如果你确实希望你的字符串是可变的,则可以使用 toCharArray 将其转换为字符数组。
如果你经常必须连接字符串,最好使用一些其他的数据结构,如 StringBuilder

  1. 双指针技巧。情景一:两边迭代。情景二:快慢指针。
  2. 若涉及到操作次数尽量少,则考虑双指针交换的问题。如移动0.(283)

KMP算法(28 实现 strStr())

原理详见

主要分为构造next数组和字符串匹配两个步骤。

题目索引

724寻找数组的中心索引(easy)

此题要求左边的和与右边的和,应该注意到不变的量。即左边的和加上索引元素再加上右边的和的总和是固定不变的,因此可以先求出总和,从而在遍历的过程中即可判断左和与右和。

35搜索插入位置(easy)

有序,二分

56合并区间(medium)

注意到端点左值小于端点右值。

498对角线遍历(medium)

二维矩阵主要是注意处理的顺序及边界值。

14最长公共前缀(easy)

横向扫描,纵向扫描,分治,二分。

5最长回文子串(medium)

掌握动态规划和中心扩散。有一种专门的马拉车算法处理此问题,时间复杂度为O(n),利用了动态规划和中心扩散的思想。

151翻转字符串里的单词(medium)

涉及trim,split,reverse,join等操作。

344反转字符串(easy)

561数组拆分 I(easy)

167两数之和 II - 输入有序数组(easy)

根据两个指针的和移动指针。

27移除元素

485最大连续1的个数(easy)

209长度最小的子数组(medium)

滑动窗口

283移动零(easy)

操作次数最少,考虑交换。

你可能感兴趣的:(Leetcode 探索)