算法:双指针
练习题Ⅰ:删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。(题目来源:LC)
解题思路:快慢指针
有序数组,定义双指针,第一为寻找有序数组中的无序元素,第二为无序元素赋值。
Java代码:
class Solution { public int removeDuplicates(int[] nums) { //寻找数组长度,定义一个变量arr,赋值为数组长度 int arr = nums.length; //如果数组长度为0,则直接返回0 if(arr == 0){ return 0; } //设置双指针 int fast = 1; // fast为寻找有序数组中的异常量 int slow = 1; // slow为有序数组赋值 //fast寻找有序数组中元素的异项,slow为有序数组赋值 while(fast
练习题Ⅱ:
给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。(题目来源:LC)
解题思路:对撞指针
左右两个指针分别进行数组的查找。当 left 指针查找到的数字与 val 相等时,将数组中 right 指针指向的数字赋值给 left 指针指向的数字,进行覆盖。观察后发现:
JAVA代码:
class Solution { public int removeElement(int[] nums, int val) { int left = 0, int right = nums.length - 1; while (left <= right) { if (nums[left] == val) { nums[left] = nums[right]; right--; }else { left++; } } return left; } }
(麻了,上个月讲的双指针,一直没搞明白对撞指针的逻辑唉。感觉自己写的没问题,但是就是执行错误,底层逻辑错误……现在也还没搞懂自己哪里出问题了,让我在反思一下再来修改笔记好了。刷题去了qaq)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)