题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
示例:
思路
要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
class Solution {
public int removeElement(int[] nums, int val) {
//定义双指针
int leftIndex = 0;
for(int rightIndex = 0; rightIndex < nums.length;rightIndex++){
if(nums[rightIndex] != val){
nums[leftIndex] = nums[rightIndex];
leftIndex++;
}
}
return leftIndex;
}
}
26. 删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
示例:
代码
class Solution {
public int removeDuplicates(int[] nums) {
int left = 1;
for(int right = 1; right < nums.length; right++){
if(nums[right-1] != nums[right]){
nums[left] = nums[right];
left++;
}
}
return left;
}
}
283 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
class Solution {
public void moveZeroes(int[] nums) {
int left = 0;
int n = nums.length;
for(int right = 0; right < n; right++){
if(nums[right] != 0){
nums[left] = nums[right];
left++;
}
}
while(left < n){
nums[left++] = 0;
}
}
}
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 1;
int n = nums.length;
for(int right = 0; right < n; right++){
nums[right] = nums[right] * nums[right];
}
while(left < n){
if(nums[left -1] > nums[left]){
int temp = nums[left];
nums[left] = nums[left-1];
nums[left-1] = temp;
}
}
return nums;
}
}
977. 有序数组的平方
题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例:
代码
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int n = nums.length;
int right = n - 1;
int index = n - 1;
int[] res = new int[n];
while(left <= right){
if(nums[left] * nums[left] > nums[right]*nums[right]){
res[index--] = nums[left] * nums[left];
left++;
}else{
res[index--] = nums[right] * nums[right];
right--;
}
}
return res;
}
}