力扣第一天

简单题

题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除 后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 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 }

 

 

posted @ 2020-12-08 21:30  tanghailing  阅读(51)  评论(0编辑  收藏  举报