前言
最近在学习算法,所以将学到的和大家分享一下。
一、题目
此时给定一个排序数组代表的是这个数组是有序的,只会出现1,1,2,3;而不会出现1,2,2,1这种情况。
二、解题方法
1.什么是双指针
我们可以放置两个指针n和i,其中n是慢指针,i是快指针。
如果nums1[n]=nums1[i],说明是重复项,我们让i自增,然后在比较nums1[n]和nums1[i]是否相等,如果还相等,说明还是重复项,继续让i自增,直到nums[n]!=nums1[i],说明重复项就结束了。
重复项结束之后,我们将不重复的值放到n+1的位置上去,同时n自增,i也自增,直到遍历完整个数组。当遍历完整个数组的时候,n及以前的元素都是不重复的,所以返回n+1即为不重复数组的长度。
2.使用双指针方法
代码如下:
public int removenums(int[] nums1){
// 首先判断数组是否为空
if(nums1.length == 0){
return 0;
}
// 定义慢指针
int n = 0;
// 定义快指针i是从0+1开始
for (int i = 1;i < nums1.length;i++){
// 如果快慢指针对应的值不相等,则n自增之后(这里是先自增)
// 将快指针对应的值,赋值为n的位置(相当于原来n+1的位置)
if(nums1[i] != nums1[n]){
n++;
nums1[n] = nums1[i];
}
}
// 遍历结束,n+1为不重复的数组长度,返回即可。
return n + 1;
}
测试代码:
Sigerithm1 sigerithm1=new Sigerithm1();
int[] nums1 = {1,1,2,3,4,5};
System.out.println(sigerithm1.removenums(nums1));
输出结果:
此方法的时间复杂度:O(n),假设数组长度为n,那么n和i分别最多遍历步。
空间复杂度:O(1)。
时间复杂度简介
算法的时间复杂度是一个函数,它定性的描述了该算法的运行时间。
空间复杂度简介
对一个算法在运行过程中临时占用储存空间大小的量度。
总结
以上就是今天的内容,算法的解题方法和思路有很多,所以小伙伴们可以大胆使用自己的思维去试试别的方法,一起加油吧!如果这篇文章对你有帮助的话,麻烦点下赞表示对作者的支持,感谢!