1. 原地修改数组类型
(1)跟数组本身元素相比
class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if (n <= 1) { return n; } int fast = 1, slow = 1; while (fast < n) { if (nums[fast] != nums[fast - 1]) { nums[slow] = nums[fast]; ++slow; } ++fast; } return slow; }}
class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if (n <= 2) { return n; } int slow = 2, fast = 2; while (fast < n) { if (nums[fast] != nums[slow - 2]) { nums[slow] = nums[fast]; ++slow; } ++fast; } return slow; }}//因此题目也可以扩展为,最多出现k次//通解扩展//只记这个就行class Solution { public int removeDuplicates(int[] nums) { return process(nums, 2); } int process(int[] nums, int k) { // 最多保留k位相同数字 int slow = 0; // 慢指针从0开始 for (int fast : nums) { // 快指针遍历整个数组 // 检查被保留的元素nums[slow−k]是否和当前待检查元素fast相同 if (slow < k || nums[slow - k] != fast) nums[slow++] = fast; } return slow; // 从nums[0]到nums[slow−1]的每个元素都不相同 }}
(2)与数组外元素相比
class Solution { public int removeElement(int[] nums, int val) { int fast = 0, slow = 0; //快指针走遍整个数组 //慢指针对烤数组 while(fast < nums.length){ //只有当前数组值不是目标值的时候,才拷贝元素 //如果是目标值,那快指针直接越过当前值不拷贝 if(nums[fast] != val){ nums[slow] = nums[fast]; slow++; } fast++; } return slow; }}class Solution { public int removeElement(int[] nums, int val) { int slow = 0; for(int fast = 0; fast < nums.length; fast++){ if( nums[fast] != val){ //这里不是nums[slow] nums[slow++] = nums[fast]; } } return slow; }}
class Solution { public void moveZeroes(int[] nums) { int slow = 0; for(int fast : nums){ if(fast != 0){ nums[slow] = fast; slow++; } } for(int i = slow; i < nums.length; i++){ nums[i]=0; } }}//赋零需要两遍便利,还不是最优class Solution { public void moveZeroes(int[] nums) { int slow = 0; for(int fast = 0; fast < nums.length; ++fast){ if(nums[fast] != 0){ int temp = nums[slow]; nums[slow] = nums[fast]; nums[fast]=temp; slow++; } } }}
class Solution { public int[] sortedSquares(int[] nums) { int left = 0; int right = nums.length - 1; int[] result = new int[nums.length]; int write = nums.length - 1; while( left <= right ){ if( nums[left] * nums[left] >= nums[right] * nums[right]){ result[write--] = nums[left] * nums[left]; left ++; }else{ result[write--] = nums[right] * nums[right]; right --; } } return result; }}