处理缩进与格式以及文献内容问题

This commit is contained in:
doomwatcher2004 2022-12-04 16:28:51 +08:00
parent e54c3804f9
commit fe46a5d77b
2 changed files with 19 additions and 65 deletions

View File

@ -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};
}
}

View File

@ -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. 左右指针一般应用于数组内的元素操作上
双指针的技巧就是为了简化我们在遍历的时候函数的复杂度,很多需要嵌套循环才能解决的问题 用双指针往往可以获得优化。