1. 删除元素专题
1.1 删除指定元素
方法1:使用快慢型双指针
慢指针定位下一个要存放元素的位置,
快指针寻找下一个要寻找的元素。
/**
* 方法1:使用快慢型双指针
*
* @param nums
* @param val
* @return
*/
public static int removeElement(int[] nums, int val) {
int size = nums.length;
int slow = 0, fast = 0;
while (fast < size) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
fast++;
}
return slow;
}
方法2:使用对撞型双指针
类似快排的思想。
左指针寻找等于val的位置,右指针寻找不等于val的位置。
/**
* 方法2:使用对撞型双指针
*
* @param nums
* @param val
* @return
*/
public static int removeElement2(int[] nums, int val) {
// 3, 3, 3, [], []
int right = nums.length - 1;
int left = 0;
while (left <= right) {
while (left < right) {
if (nums[right] != val) {
break;
}
right--;
}
while (left < right) {
if (nums[left] == val) {
break;
}
left++;
}
nums[left++] = nums[right--];
}
return left;
}
1.2 删除重复元素
方法1:使用快慢型双指针
慢指针定位下一个要存放元素的位置,
快指针寻找下一个要寻找的元素。
public static int removeDuplicates(int[] nums) {
//slow表示可以放入新元素的位置,索引为0的元素不用管
int slow = 1, fast = 1;
int size = nums.length - 1;
while (fast <= size) {
if (nums[fast] == nums[fast - 1]) {
fast++;
} else {
nums[slow++] = nums[fast++];
}
}
return slow;
}
2. 按奇偶排序数组
同样类似快排的思想。
左指针寻找奇数的位置,右指针寻找偶数的位置。
/**
* 双指针,不稳定 的移动
*
* @param nums
* @return
*/
public static int[] sortArrayByParity(int[] nums) {
int left = 0, right = nums.length - 1;
while (left <= right) {
while (left <= right) {
if (nums[left] % 2 == 1) {
break;
}
left++;
}
while (left <= right) {
if (nums[right] % 2 == 0) {
break;
}
right--;
}
if (left <= right ) {
int temp = nums[left];
nums[left++] = nums[right];
nums[right--] = temp;
}
}
return nums;
}