今天哈士奇写算法题的时候看到了一个新算法————原地算法,哈士奇查询了一下这个算法
在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。(百度百科)
通过哈士奇的理解来说,对于大家的数组操作时,使用原地算法就是在原有数组上进行操作,而不另外开辟或者极小的使用额外开辟的计算机空间。通常来说,原地算法的时间复杂度为O(1)
优点:
1.时间复杂度极低,由于在原数组进行操作,时间复杂度可以保持在极低的状态 2.空间复杂度极低,不开辟或者开辟极小的额外空间导致原地算法几乎不消耗额外的计算机空间,因此在这方面也具有优越性
实例:
哈士奇为大家分享leetcode中的数组第26题,这是一个经典的原地算法题目,要求我们在原数组进行操作,并且不产生新的数组
贴上哈士奇的题解:
var removeDuplicates = function(nums) {
let index=0;
for(let i=0;i<nums.length;i++){
if(nums[i]!=nums[index])
{
index++
nums[index]=nums[i];
}
}
nums.splice(index+1,nums.length)
return index+1
};
为什么使用index与i两个变量作为索引呢?这里的index是新数组的索引,i是老数组的索引,使用当发现nums[i]!=nums[index]时那么就需要为index留出新空间用于老数组元素的加入,最后在通过splice()方法将多余的部分删除,就可以得到最后的修改过的新数组。