这是我参与更文挑战的第1天,活动详情查看: 更文挑战
-删除有序数组中的重复项
题目有一点说明值得注意
根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
快慢指针法
public int removeDuplicates(int[] nums) {
if(nums.length <= 1) {
return nums.length;
}
// 慢指针:用于记录当前不重复元素下标
int slow = 0;
// 快指针:用于遍历数组,要判断是否有重复元素,必须要有两个元素,所以这里从第二个元素开始
int fast = 1;
// 终止条件是遍历完成整个数组元素
while(fast < nums.length) {
// 快慢指针的指向的值不同是,代表有新的元素
if (nums[slow] != nums[fast]) {
//移动到下一位
slow++;
// 重新赋值
nums[slow] = nums[fast];
}
fast ++;
}
//因为要求是返回数组长度,slow从0开始,所以这里要加一
return ++ slow;
}
复杂度分析:
- 时间复杂度:,最多遍历一次数组。
- 空间复杂度:,只用了常数额外空间。
两数之和
暴力枚举
没有思路,就按最简单的来。
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length -1; i++ ){
for(int j = i + 1; j < nums.length; j ++){
if(nums[i] + nums[j] == target) {
return new int[]{i,j};
}
}
}
return new int[]{};
}
虽然暴力枚举的时间复杂度高,,最坏的情况要遍历两次数组长度,如何写好枚举遍历还是要记住,这是在没有想到更好的方法之前的最优解。