diff --git a/codes/java/chapter_doublePointer/double_pointer.java b/codes/java/chapter_doublePointer/double_pointer.java deleted file mode 100644 index 9feedd58c..000000000 --- a/codes/java/chapter_doublePointer/double_pointer.java +++ /dev/null @@ -1,44 +0,0 @@ - -import java.util.Arrays; - -public class double_pointer { - public static void main(String[] args) { - //int[] arr = {3,2,2,3}; - //int res = removeElement(arr, 3); - //System.out.println("移除元素后的有效长度"+res+" :"+" 移除过后数组内的数据"+ Arrays.toString(arr)); - - int[] arr = {2,7,11,15}; - int[] result = twoSum(arr, 9); - System.out.println("结果集:"+ Arrays.toString(result)); - } - - //快慢指针案例 - static int removeElement(int[] nums, int val) { - int fast = 0, slow = 0; - while (fast < nums.length) { - //如果等于target那么fast++,slow记录命中的下表等到fast找到不等于的时候替换slow - if (nums[fast] != val) { - nums[slow] = nums[fast]; - slow++; - } - fast++; - } - return slow; - } - //相向左右指针案例 - static int[] twoSum(int[] nums, int target) { - // 一左一右两个指针相向而行 - int left = 0, right = nums.length - 1; - while (left < right) { - int sum = nums[left] + nums[right]; - if (sum == target) { - return new int[]{left, right}; - } else if (sum < target) { - left++; // 让 sum 大一点 - } else if (sum > target) { - right--; // 让 sum 小一点 - } - } - return new int[]{-1, -1}; - } -} diff --git a/docs/chapter_doublePointer/Double_pointer.md b/docs/chapter_doublePointer/Double_pointer.md index 1683a65d0..1d8089591 100644 --- a/docs/chapter_doublePointer/Double_pointer.md +++ b/docs/chapter_doublePointer/Double_pointer.md @@ -14,14 +14,14 @@ ​ **快慢指针** 指的是两个指针从同一侧开始遍历数组,将这两个指针分别定义为`快指针(fast)`和`慢指针(slow)`,两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如快指针(fast)每次增长两个,慢指针(slow)每次增长一个。 -**常用术语**: +**PS**: 慢指针(slow)一般指向数组的第一个元素 快指针(fast)一般指向数组的第一个元素 用一个小案例理解快慢指针在数组中的作用 -### 移除数组中的元素 +### [移除数组中的元素](https://leetcode.cn/problems/remove-element/) 有一个数组nums 我们需要根据输入的 `target`来移除数组中的元素,不需要考虑数组中超出新长度后面的元素 @@ -37,28 +37,28 @@ 根据示例图思路我们此时再讲述快慢双指针的使用方法 : -1、一般来说 fast指针与slow指针的按照区间前后移动 在移动的过程中去处理数据 +1. 一般来说 fast指针与slow指针的按照区间前后移动 在移动的过程中去处理数据 -2、 其实快慢指针的移动区间不一定是非要 fast+2 slow+1 区间可以根据不同需要灵活变化 +2. 其实快慢指针的移动区间不一定是非要 fast+2 slow+1 区间可以根据不同需要灵活变化 -3、一般来说使用快慢双指针的复杂度是 O(N) +3. 一般来说使用快慢双指针的复杂度是 O(N) -### 解题Code +### 解题 Code === "Java" - ```java title="array.java" + ```java title="double_pointer.java" public static void main(String[] args) { int[] arr = {3,2,2,3}; int res = removeElement(arr, 3); System.out.println("有效长度"+res+" :"+" 数组内的数据"+ Arrays.toString(arr)); } - //快慢指针案例 + // 快慢指针案例 static int removeElement(int[] nums, int val) { int fast = 0, slow = 0; while (fast < nums.length) { - //如果等于target那么fast++,slow记录命中的下表等到fast找到不等于的时候替换slow + // 如果等于target那么fast++,slow记录命中的下表等到fast找到不等于的时候替换slow if (nums[fast] != val) { nums[slow] = nums[fast]; slow++; @@ -73,13 +73,11 @@ ## 左右指针 -​ **左右指针**是指在数组中,将指向最左侧的索引定义为`左指针(left)`,最右侧的定义为`右指针(right)`,然后从两头向中间进行数组遍历。快速排序和N数之和就是典型的左右双指针问题。 - 这里引用一道入门的数组题目的双指针解法来理解对撞双指针 -### [两数之和](https://leetcode.cn/problems/two-sum) +### [两数之和 II](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/) -给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 +给你一个下标从 **1** 开始的整数数组 `numbers` ,该数组已按 **非递减顺序排列**和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 @@ -95,22 +93,22 @@ 根据示例图思路我们此时再讲述相向左右双指针的使用方法 : -1、根据条件判断去调整left和right指针的位置 来达到想要的效果 +1. 根据条件判断去调整left和right指针的位置 来达到想要的效果 -2、一般来说使用左右双指针的复杂度是 O(N) +2. 一般来说使用左右双指针的复杂度是 O(N) -### 解题Code +### 解题 Code === "Java" - ```java title="array.java" + ```java title="double_pointer.java" public static void main(String[] args) { int[] arr = {2,7,11,15}; int[] result = twoSum(arr, 9); System.out.println("结果集:"+ Arrays.toString(result)); } - //相向左右指针案例 + // 相向左右指针案例 static int[] twoSum(int[] nums, int target) { // 一左一右两个指针相向而行 int left = 0, right = nums.length - 1; @@ -130,10 +128,10 @@ ## 总结 -快慢指针和左右指针都是使用双指针的技巧 : +快慢指针和左右指针都是使用双指针的技巧: -1、快慢指针一般应用于需要遍历比较或者是数组,链表的元素操作 +1. 快慢指针一般应用于需要遍历比较或者是数组,链表的元素操作 -2、左右指针一般应用于数组内的元素操作上 +2. 左右指针一般应用于数组内的元素操作上 双指针的技巧就是为了简化我们在遍历的时候函数的复杂度,很多需要嵌套循环才能解决的问题 用双指针往往可以获得优化。 \ No newline at end of file