1. 原地修改数组类型

(1)跟数组本身元素相比

26. 删除有序数组中的重复项

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int n = nums.length;
  4. if (n <= 1) {
  5. return n;
  6. }
  7. int fast = 1, slow = 1;
  8. while (fast < n) {
  9. if (nums[fast] != nums[fast - 1]) {
  10. nums[slow] = nums[fast];
  11. ++slow;
  12. }
  13. ++fast;
  14. }
  15. return slow;
  16. }
  17. }

80. 删除有序数组中的重复项 II

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int n = nums.length;
  4. if (n <= 2) {
  5. return n;
  6. }
  7. int slow = 2, fast = 2;
  8. while (fast < n) {
  9. if (nums[fast] != nums[slow - 2]) {
  10. nums[slow] = nums[fast];
  11. ++slow;
  12. }
  13. ++fast;
  14. }
  15. return slow;
  16. }
  17. }
  18. //因此题目也可以扩展为,最多出现k次
  19. //通解扩展
  20. //只记这个就行
  21. class Solution {
  22. public int removeDuplicates(int[] nums) {
  23. return process(nums, 2);
  24. }
  25. int process(int[] nums, int k) { // 最多保留k位相同数字
  26. int slow = 0; // 慢指针从0开始
  27. for (int fast : nums) { // 快指针遍历整个数组
  28. // 检查被保留的元素nums[slow−k]是否和当前待检查元素fast相同
  29. if (slow < k || nums[slow - k] != fast)
  30. nums[slow++] = fast;
  31. }
  32. return slow; // 从nums[0]到nums[slow−1]的每个元素都不相同
  33. }
  34. }

(2)与数组外元素相比

27.移除元素

  1. class Solution {
  2. public int removeElement(int[] nums, int val) {
  3. int fast = 0, slow = 0;
  4. //快指针走遍整个数组
  5. //慢指针对烤数组
  6. while(fast < nums.length){
  7. //只有当前数组值不是目标值的时候,才拷贝元素
  8. //如果是目标值,那快指针直接越过当前值不拷贝
  9. if(nums[fast] != val){
  10. nums[slow] = nums[fast];
  11. slow++;
  12. }
  13. fast++;
  14. }
  15. return slow;
  16. }
  17. }
  18. class Solution {
  19. public int removeElement(int[] nums, int val) {
  20. int slow = 0;
  21. for(int fast = 0; fast < nums.length; fast++){
  22. if( nums[fast] != val){ //这里不是nums[slow]
  23. nums[slow++] = nums[fast];
  24. }
  25. }
  26. return slow;
  27. }
  28. }

283.移动零

  1. class Solution {
  2. public void moveZeroes(int[] nums) {
  3. int slow = 0;
  4. for(int fast : nums){
  5. if(fast != 0){
  6. nums[slow] = fast;
  7. slow++;
  8. }
  9. }
  10. for(int i = slow; i < nums.length; i++){
  11. nums[i]=0;
  12. }
  13. }
  14. }
  15. //赋零需要两遍便利,还不是最优
  16. class Solution {
  17. public void moveZeroes(int[] nums) {
  18. int slow = 0;
  19. for(int fast = 0; fast < nums.length; ++fast){
  20. if(nums[fast] != 0){
  21. int temp = nums[slow];
  22. nums[slow] = nums[fast];
  23. nums[fast]=temp;
  24. slow++;
  25. }
  26. }
  27. }
  28. }

2. 有序数组的平方

  1. class Solution {
  2. public int[] sortedSquares(int[] nums) {
  3. int left = 0;
  4. int right = nums.length - 1;
  5. int[] result = new int[nums.length];
  6. int write = nums.length - 1;
  7. while( left <= right ){
  8. if( nums[left] * nums[left] >= nums[right] * nums[right]){
  9. result[write--] = nums[left] * nums[left];
  10. left ++;
  11. }else{
  12. result[write--] = nums[right] * nums[right];
  13. right --;
  14. }
  15. }
  16. return result;
  17. }
  18. }