处理缩进与格式以及文献内容问题
This commit is contained in:
parent
e54c3804f9
commit
fe46a5d77b
@ -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};
|
||||
}
|
||||
}
|
@ -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. 左右指针一般应用于数组内的元素操作上
|
||||
|
||||
双指针的技巧就是为了简化我们在遍历的时候函数的复杂度,很多需要嵌套循环才能解决的问题 用双指针往往可以获得优化。
|
Loading…
Reference in New Issue
Block a user