算法与数据结构面试

对数组中包含n个字符串进行字典序排序

字典序排序就是按照英文字典的排序算法,好比12345排在12354前面算法

假设数组中最常字符串的长度为s,则时间复杂度为o(s*nlgn)数组

数据规模

若是想在1s内解决问题的话数据结构

时间复杂度 须要时间
O(n*n) 10^4
O(n) 10^8
O(nlgn) 10^7

空间复杂度

是指开的出来用于辅助算法的空间,不算自己数据的存储。 递归的时间复杂度是叠加的。函数

移动零

给定一个数组 nums,编写一个函数将全部 0 移动到数组的末尾,同时保持非零元素的相对顺序。spa

示例设计

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
复制代码

说明指针

  • 1,必须在原数组上操做,不能拷贝额外的数组。
  • 2,尽可能减小操做次数。

思路

使用双指针进行移动,不断的移动指针,进行求解。code

颜色分类

给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。排序

此题中,咱们使用整数 0、1 和 2 分别表示红色、白色和蓝色。递归

注意: 不能使用代码库中的排序函数来解决这道题

示例

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
复制代码

说明

  • 1,一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和2元素的个数,而后按照0、一、2的排序,重写当前数组。
  • 2,你能想出一个仅使用常数空间的一趟扫描算法吗?。

思路

数组分红三部分,也就是三路快排。

两数之和 II - 输入有序数组

给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1必须小于index2。

示例

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 27 之和等于目标数 9 。所以 index1 = 1, index2 = 2复制代码

说明

  • 1, 返回的下标值(index1 和 index2)不是从零开始的。
  • 2, 你能够假设每一个输入只对应惟一的答案,并且你不能够重复使用相同的元素。

思路

利用排序,两路指着进行对撞。

两数之和 II - 输入有序数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中知足其和 ≥s的长度最小的连续子数组。若是不存在符合条件的连续子数组,返回 0。

示例

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 。
复制代码

说明

  • 1, 若是你已经完成了O(n) 时间复杂度的解法,

思路

也是利用双路索引

454. 四数相加 II

给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。

为了使问题简单化,全部的 A, B, C, D 具备相同的长度N,且 0 ≤ N ≤ 500 。全部整数的范围在 -228 到 228 - 1 之间,最终结果不会超过231 - 1 。

示例

输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

输出:
2

解释:
两个元组以下:
1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

复制代码

思路。

根据数据规模为500,能够设计一个O(N^2)的算法,遍历a和b数组,而后再遍历c和d数组,把c和d数组的和放到一个查找表中e中,而后在e中查找。

算法之递归思想

递归最合适的数据结构就是递归。

打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有必定的现金,影响你偷窃的惟一制约因素就是相邻的房屋装有相互连通的防盗系统,若是两间相邻的房屋在同一夜被小偷闯入,系统会自动报警。

给定一个表明每一个房屋存放金额的非负整数数组,计算你在不触动警报装置的状况下,可以偷窃到的最高金额。

示例

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,而后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12复制代码

思路

使用动态规划

贪心选择性质

若是选择了贪心,不会影响剩下的贪心影响后面的选择

相关文章
相关标签/搜索