力扣第一天
简单题
题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除 后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件
1 //刚开始想怎么可能在不使用额外的数组空间,只在原数组上修改。
2 //所以想的是先把给定数组直接放到set集合中去重,然后再取出来放入list集合中,再把值从list中依次取出覆盖原来的数组
3 public class ArrayTest {
4
5 public static void main(String[] args) {
6 int[] nums = {0,0,1,1,2,2,3}; //申明数组
7 int length = removeDuplicates(nums); // 调用方法,length=3
8 }
9
10 public static int removeDuplicates(int[] nums) {
11 List<Integer> list = new ArrayList<>(); //申明list集合
12 TreeSet<Integer> trees = new TreeSet<>(); //申明set集合
13 //将数组的值放入set集合中去重
14 for (int i = 0; i < nums.length; i++) {
15 trees.add(nums[i]);
16 }
17 //从set集合中值取出放入list中
18 for (Integer num : trees) {
19 list.add(num);
20 }
21 //根据索引将list中的值覆盖数组的值
22 for (int i = 0; i < list.size(); i++) {
23 nums[i] = list.get(i);
24 }
25 //返回list的大小
26 return list.size();
27 }
28 }
这种方法前提是数组已经排序
1 //参考答案:
2 //利用慢指针i和快指针j,快指针是用来遍历数组的,慢指针是用来记录索引的
3
4 public class ArrayTest {
5
6 public static void main(String[] args) {
7 int[] nums = {0,0,1,1,2,2,3}; //申明数组
8 int length = removeDuplicates(nums); // 调用方法,length=3, nums=[0,1,2,3,2,2,3]
9 }
10
11 public static int removeDuplicates(int[] nums) {
12 if(nums.length == 0) return 0; //数组长度为0时退出
13
14 int i = 0; //初始索引为0
15 for(int j = 1; j < nums.length; j++){
16 //遍历数组,跳过重复的值,遇到不同的值,就将初始索引+1的位置的值替换为该值,继续往后遍历
17 if(nums[i] != nums[j]){
18 i++; //将初始索引加1
19 nums[i] == nums[j]; //将数组索引为j的位置的值覆盖索引i+1位置的值
20 }
21 return i + 1;
22 }
23 }
24 }