针对之前的查找排序算法的学习,让我们来看看几道相关的面试题。
可以清楚看到题目的要求,不能返回同一元素对应的下标,且一定是有答案的。
两种思路:
第一种,直接暴力求解,利用循环来比较,最后返回结果。
代码实现及演示:
思路就是,利用循环遍历直接暴力求解,第i的数和第i+1个数匹配相加判断是否满足条件?时间复杂度O(n^2) 效率比较低下。
接下来,转换思维,已知两个数相加等于目标数,那我们可不可以通过一个数与目标数之间的关系来表示另一个数,显然可以。假设第一个数是a 另一个数就是 target-a。首先排序,然后利用二分查找进行下标寻找即可。可以看到这里没有说列表已经有序,所以我们可以通过二维数组排序。
代码及结果演示:
思路点拨:
我们最后返回的是对应的下标,且列表没有排序,我们就可以下标和值分解;排好序后利用二分查找。a这个数利用循环拿到,对应算出b 通过二分查找,拿到结果。如果找到b了,直接返回下标,利用内置函数sorted排序即可。
还有一种根据字典来:
可以看到字典的这种方法是很恐怖的!!!
给定两种方法:
第一种是通过排序判断;
第二种是通过字典统计。
可以看出上面这道题是比较简单的,要么排序判断字符串是否相等,要么利用字典统计各个字符出出现的次数,时间复杂度皆为O(n)
我们可以看到这是有序的二维数组,那就可以考虑使用二分查找(针对顺序列表)
代码如下:
总结:
一般我们做算法题都可以往排序和查找上想,顺序列表,可以想到而二分查找。一般都是修改mid,转换一下差不多就可以实现了。字典有时候是不错的选择,查找数据或者比较数据都可以。
今天的分享就到这里,谢谢各位的阅读!