给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置:
int SearchInsert(int[] arr,int x){
for(int i = 0;i < arr.length;i++){
if(arr[i] == x){
return i;
}else if(arr[arr.length - 1] < x){
return arr.length;
}else if(arr[i] < x && arr[i+1] > x ){
return i + 1;
}
}
return 0;
}
代码较冗余,第一个if可修改省略后面的if(虽然这样,但内存消耗也击败了百分之七十八的人,很迷)。
看别人的代码都是二分查找,便百度了一下效率问题,如果仅是学习的话,不如直接线性查找来的直白,而且需要数据足够大二分的优势才能凸显。
如果数据一直在剧烈变化,线性查找的优势也可能更大。
贴一段别人的回复:
如果是外存查找,例如硬盘查找,硬盘读取次数对总时间的影响,远大于算法复杂度的影响,此时线性查找极有可能更更快。这种情况下应该尽量去减少读取硬盘的次数,而不是直接取优化算法复杂度。内存查找的情况简单一些,二分查找的劣势是多了一个排序的过程。如果数据一直在剧烈变化,线性查找反而可能更优。反之如果数据是静态的,则一次排序即可,查找的key足够随机的情况下,二分查找的效率几乎总是「远远」高于线性查找。如果key的随机性不够,例如存在hot key,那就需要结合实际情况去解决了,例如做hot key预估