【总结】
参考https://www.bilibili.com/video/BV1Pv4y1Z76N
适用情况:大部分需数组升序
【代码】
27 移除元素
不用管移除后半部分是否为正确答案,所以可直接nums[flag]=nums[i]
class Solution { public int removeElement(int[] nums, int val) { if(nums==null||nums.length==0) return 0; int flag=0; for(int i=0;i<nums.length;i++){ if(nums[i]!=val){ nums[flag]=nums[i]; flag++; } } return flag; } }
更规范的话,是把i点和flag点位置的元素进行交换(参考283)
283 移动0
将0移动到最后
class Solution { public void moveZeroes(int[] nums) { int j = 0; for(int i = 0; i < nums.length; i++) { if(nums[i] != 0) { int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; j++; } } } }
26 移除重复元素
数组升序排列,只需与前一个比较即可
class Solution { public int removeDuplicates(int[] nums) { int flag=1; for(int i=1;i<nums.length;i++){ if(nums[i]!=nums[i-1]){ //因为升序排列,只用和前面比即可 nums[flag]=nums[i]; flag++; } } return flag; } }
80 移除重复数组II
数组升序排列,每个元素最多可以出现两次,用check标注
class Solution { public int removeDuplicates(int[] nums) { int flag=1; int check=-1; for(int i=1;i<nums.length;i++){ if(nums[i]!=nums[i-1]){ nums[flag]=nums[i]; flag++; check=-1; } else if(nums[i]==nums[i-1]&&check==-1){ nums[flag]=nums[i]; flag++; check=1; } } return flag; } }
977
求升序数组平方后的数组(也要保持升序)
唯一可能的特例是负数情况!【-1,1,2】时也是直接平方即可,只有左边负数足够小,即【-10,1,2】时
因为升序排列,那么比较左右两边绝对值,插入新数组即可
right和left是对原数组nums
flag是对新数组ans
class Solution { public int[] sortedSquares(int[] nums) { int[] ans=new int[nums.length]; int left=0; int right=nums.length-1; for(int flag=nums.length-1;flag>=0;flag--){ if(Math.abs(nums[left])>Math.abs(nums[right])){ ans[flag]=nums[left]*nums[left]; left++; } else{ ans[flag]=nums[right]*nums[right]; right--; } } return ans; } }