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

在这里插入图片描述
这里提供两种解法

快慢指针(官方优解)

我在写这道题目的时候,读题不认真,没看到是排序这个条件,所以走了弯路,如果注意到这个条件思路还是比较简单的
i为慢指针,j为快指针,数组因为顺序排列,设i=0为第一个元素,第二个元素j如果不等于i,则将j赋值到++i个元素,如果相同,则继续遍历。只有不同的元素出现时才添加。

 public static int removeDuplicates(int[] nums) {
    
    
	    if(nums.length==0)return 0;
	    int i=0;
	    for(int j=1;j<nums.length;j++){
    
    
	    	if(nums[i]!=nums[j]){
    
    
	    		nums[++i]=nums[j];
	    	}
	    }
	    return i+1;
    }

hash表解法(通解,不限于排序数组)

这个是我自己解这题的解法,运行时间没有上面那个块(3ms:1ms),但是内存消耗比那个还小

思路:
哈希表初为空,往哈希表里边放不重复的键值对(数组元素为key,数组下标为value。这么做是为了方便key比较是否重复)
用containsKey看是否重复 ,用一个size标记数的个数,然后将每个不重复的数从nums[0]开始依次赋值,于此同时将每个数放到map中,以供后面的数进行条件判断

public static int removeDuplicates(int[] nums) {
    
    
		int size=0;	//待返回的不重复元素个数
		Map<Integer, Integer>map=new HashMap<Integer, Integer>(); //将不重复的数组元素往map中放
		for (int i=0;i<nums.length;i++) {
    
    
			if(!map.containsKey(nums[i])){
    
    //同时用map的containsKey方法决定遍历元素是否在map中存在,从而决定是否往里边放
					nums[map.size()]=nums[i]; //将这个不重复的数紧接着赋值到上一个的后边
					map.put(nums[map.size()], i); //将这个数同时放到map中
					size++;//有效数的个数+1
			}
		}
	        return size;
	 }

猜你喜欢

转载自blog.csdn.net/WA_MC/article/details/115018376
今日推荐