字典序排序就是按照英文字典的排序算法,好比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]
复制代码
说明指针
使用双指针进行移动,不断的移动指针,进行求解。code
给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。排序
此题中,咱们使用整数 0、1 和 2 分别表示红色、白色和蓝色。递归
注意: 不能使用代码库中的排序函数来解决这道题
示例
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
复制代码
说明
数组分红三部分,也就是三路快排。
给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1必须小于index2。
示例
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。所以 index1 = 1, index2 = 2 。
复制代码
说明
利用排序,两路指着进行对撞。
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中知足其和 ≥s的长度最小的连续子数组。若是不存在符合条件的连续子数组,返回 0。
示例
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 。
复制代码
说明
也是利用双路索引
给定四个包含整数的数组列表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 。
复制代码
使用动态规划
若是选择了贪心,不会影响剩下的贪心影响后面的选择