数组相关题_python版
寻找某个值的区间(leetcode 34 Search for a Range)
题目:这题要求在一个排好序可能有重复元素的数组里面找到包含某个值的区间范围。要求使用O(log n)的时间,所以我们采用两次二分查找。
For Example:
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
1 |
|
第K个数的问题
题目:这题是一道很好的面试题目,首先题目短小,很快就能说清题意而且有很多种解法。从简单到复杂的解法都有,梯度均匀。解决它不需要预先知道特殊领域知识。
这题有很多思路:
- 按从大到小全排序,然后取第k个元素,时间复杂度O(nlogn),空间复杂度O(1)
- 利用堆进行部分排序。维护一个大根堆,将数组元素全部压入堆,然后弹出k次,第k个就是答案。时间复杂度O(klogn)O(klogn),空间复杂度O(n)O(n)
- 选择排序,第k次选择后即可得到第k大的数,时间复杂度O(nk),空间复杂度O(1)
以上三种方法时间复杂度太高。下面介绍两种更好的方法:
维持K大小的堆排序(优先队列)
1 | ''' |
快速排序,时间复杂度近似O(n)
1 | ''' |
求根算法( LeetCode 69)
题目:计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
思路一:直接从1到x/2之间遍历,判断是否是平方根的条件是,i*i小于等于x并且小于等于x并且(i+1)*(i+1)大于x,则返回i。超时 。
思路二:二分查找法。初始化i=0,j=x,mid=0。进入循环,找到中间值mid = (i + j) / 2,如果mid>x / mid,表示mid不是平方根,且数值过大,则j=mid。如果mid小于等于x / mid,则判断(mid + 1) > x / (mid + 1),表示mid*mid小于x,并且mid再加1后的平方就会比x大,这表示mid就是那个平方根,返回mid。否则表示mid过小,i=mid。
1 | class Solution(object): |
数组中后面的数减前面的数的差的最大值
题目:如何求数组中数对差最大。数对差是指一个数组中某两个元素a和b(并且a排在b的前面),a减去b所得到的差值。
思路一:遍历存储最大值
思路二:首先求出数组中任意一对相邻的数据之间的差值,得到一个新的数组。如果某两个数据之间的数对差最大,也就是说这两个数据之间的差值最大。假设这两个数据的位置是i和j,那么这两个位置之间的数据是a[i],a[i+1],a[i+2]……,a[j-1],a[j]。那么a[i]-a[j]=(a[i]-a[i+1])+(a[i+1]-a[i+2])+……(a[j-1]-a[j]),括号中的数据是相邻数据的差值,都已经在前面求出来了。然后这个问题就转化为了求数组中连续的子数组和最大的问题,这个问题可以通过动态规划问题求出来。
1 | import random |
合并多个有序数组
1 | #采用归并排序算法 |
两个有序数组求差集
思路一:依次取出较小数组的元素,然后再另外一个数组上进行二分查找
思路二:用齐头并进的两个下标
1 | class Solution: |
两个集合如何求并集,交集;
1 | python集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如: |
给定一个数组求中位数
(中位数,就是数组排序后处于数组最中间的那个元素)
思路:和TOP k问题一样,这里就不写了。(先排序再取中位数不优)