算法-数组-删除有序数组中的重复项和两数之和

173 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

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

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

题目有一点说明值得注意

根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。

快慢指针法

    public int removeDuplicates(int[] nums) {
        if(nums.length <= 1) {
            return nums.length;
        }
        // 慢指针:用于记录当前不重复元素下标
        int slow = 0;
        // 快指针:用于遍历数组,要判断是否有重复元素,必须要有两个元素,所以这里从第二个元素开始
        int fast = 1;
        // 终止条件是遍历完成整个数组元素
        while(fast < nums.length) {
            // 快慢指针的指向的值不同是,代表有新的元素
            if (nums[slow] != nums[fast]) {
                //移动到下一位
                slow++;    
                // 重新赋值
                nums[slow] = nums[fast];
            }

            fast ++;
         }

            //因为要求是返回数组长度,slow从0开始,所以这里要加一
         return ++ slow;
    }

复杂度分析:

  • 时间复杂度:O(n)O(n),最多遍历一次数组。
  • 空间复杂度:O(1)O(1),只用了常数额外空间。

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

暴力枚举

没有思路,就按最简单的来。

 public int[] twoSum(int[] nums, int target) {
        for(int i = 0; i < nums.length -1; i++ ){
            for(int j = i + 1; j < nums.length; j ++){
                if(nums[i] + nums[j] == target) {
                    return new int[]{i,j};
                }
            }
        }
        return new int[]{};
    }

虽然暴力枚举的时间复杂度高,O(N2)O(N²),最坏的情况要遍历两次数组长度,如何写好枚举遍历还是要记住,这是在没有想到更好的方法之前的最优解。