LeetCode算法学习笔记 - Day1

Java删除排序数组中的重复项

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

LeetCode高赞评论是这样的

    public int removeDuplicates(int[] A) {
        int count = 0;//重复的数字个数
        for (int right = 1; right < A.length; right++) {
            if (A[right] == A[right - 1]) {
                //如果有重复的,count要加1
                count++;
            } else {
                //如果没有重复,后面的就往前挪
                A[right - count] = A[right];
            }
        }
        //数组的长度减去重复的个数
        return A.length - count;
    }

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/?discussion=4Zkrel
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我尝试着不使用int[]数组而使用ArrayList数组去进行去重

	public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(0);integers.add(0);
        integers.add(1);integers.add(1);
        integers.add(2);integers.add(2);
        integers.add(3);integers.add(3);
        integers.add(4);integers.add(5);
        integers.add(6);integers.add(7);
        integers.add(8);integers.add(8);
        for (int i = 1; i < integers.size(); i++) {
            if (integers.get(i).equals(integers.get(i-1))){
                integers.remove(i);
            }
        }
        System.out.println(integers.length);
    }

因为ArrayList内的数字不是从小到大挨着的,而去重方法需要把数字依次排序,所以如果ArrayList内的数字不是依次排序的话需要去排序一下
我最后出来的结果和高赞回到的结果有差异但达到了题目要求(去重+返回去重后的长度)

Java计算股票最大收益

  • 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
  • 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)
  • 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
	public static int maxProfit(int[] prices){
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < prices.length; i++) {
            integers.add(prices[i]);
        }
        int total = 0;
        for (int i = 0; i < integers.size(); i++) {
            if (i != integers.size() - 1){
                if (integers.get(i) < integers.get(i+1)){
                    total += integers.get(i+1) - integers.get(i);
                }
            }
        }
        return total;
    }
    
这题相对简单,解题思路是判断当前数字和下一个数字谁大,然后把总和加起来就是总体收益
不过代码比较累赘还可优化

Java旋转数组

  • 给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数
	public void rotate(int[] nums, int k) {
        while (k > nums.length){
            k = k- nums.length;
        }
        int[] ints = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            if (i+1 <= k){
                ints[i] = nums[nums.length + i - k];
            }else {
                ints[i] = nums[i - k];
            }
        }
        for (int i = 0; i < ints.length; i++) {
            nums[i] = ints[i];
        }
    }

Java判断数组内是否存在重复元素

  • 给定一个整数数组,判断是否存在重复元素。
  • 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
	public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i-1]){
                return true;
            }
        }
        return false;
    }

Java返回只出现一次的数字

  • 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
	public static int singleNumber(int[] nums) {
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (i == nums.length-1){
                if (nums[i -1] != nums[i]){
                    return nums[i];
                }
            }else {
                if (nums[i+1] != nums[i] && nums[i-1] != nums[i]){
                    return nums[i];
                }
            }
        }
        return 0;
    }

这是自己写的方法(很累赘)
最优解是使用异或运算.如下:

	public int singleNumber(int[] nums) {
	    int reduce = 0;
	    for (int num : nums) {
	        reduce =  reduce ^ num;
	    }
	    return reduce;
	}

两个数组的交集 II

  • 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出
  • 现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
	public int[] intersect(int[] nums1, int[] nums2) {
	    ArrayList<Integer> integers = new ArrayList<>();
	    for (int i = 0; i < nums1.length; i++) {
	        for (int j = 0; j < nums2.length; j++) {
	            if (nums1[i] == nums2[j]){
	                nums2[j] = -1;
	                integers.add(nums1[i]);
	                break;
	            }
	        }
	    }
	    int[] nums = new int[integers.size()];
	    for (int i = 0; i < integers.size(); i++) {
	        nums[i] = integers.get(i);
	    }
	    return nums;
	}

使用两个循环获取两个数组中相同的数字并把它添加到外部的ArrayList中方便使用
(获取相同数字后需要把第二个数字的相同数字设置成-1避免后面的循环重复获取该数字|然后就要break避免比较后面的数字)
之后就把ArrayList内的数据遍历到int[]即可

Java加一

  • 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
  • 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
  • 你可以假设除了整数 0 之外,这个整数不会以零开头。
    题目很迷啊很多人都看不懂.大概就是给定一个数组然后需要把数组遍历出来形成一个数字.再把这个数字+1然后再变为一个数组即可
    下面看看我的写法:
	public static int[] plusOne(int[] digits) {
        ArrayList<String> stringArrayList = new ArrayList<>();
        String num = "";
        for (int i = 0; i < digits.length; i++) {
            num += digits[i];
        }
        BigInteger int_num = BigInteger.valueOf(Long.parseLong(num)+1);
        for (int i = 0; i < String.valueOf(int_num).length(); i++) {
            stringArrayList.add(String.valueOf(int_num).substring(i,i+1));
        }
        int[] ints = new int[stringArrayList.size()];
        for (int i = 0; i < stringArrayList.size(); i++) {
            ints[i] = Integer.parseInt(stringArrayList.get(i));
        }
        return ints;
    }

最后的返回结果是没问题的不过在LeetCode上不能运行(因为LeetCode编辑器没有BigInteger这个包)

下面看一个评论区高赞的写法

    public int[] plusOne(int[] digits) {
        int length = digits.length;
        for (int i = length - 1; i >= 0; i--) {
            if (digits[i] != 9) {
                //如果数组当前元素不等于9,直接加1
                //然后直接返回
                digits[i]++;
                return digits;
            } else {
                //如果数组当前元素等于9,那么加1之后
                //肯定会变为0,我们先让他变为0
                digits[i] = 0;
            }
        }
        //除非数组中的元素都是9,否则不会走到这一步,
        //如果数组的元素都是9,我们只需要把数组的长度
        //增加1,并且把数组的第一个元素置为1即可
        int temp[] = new int[length + 1];
        temp[0] = 1;
        return temp;
    }

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2cv1c/?discussion=v8T8jK
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java移动0

  • 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
	public void moveZeroes(int[] nums) {
	    int start = 0;
	    int all = 0;
	    for (int i = 0; i < nums.length; i++) {
	        if (nums[i] == 0){
	            all += 1;
	        }
	    }
	    while (start <= all){
	        start++;
	        for (int i = 0; i < nums.length; i++) {
	            if (nums[i] == 0 && i< nums.length-1){
	                int left = nums[i];
	                int right = nums[i+1];
	                nums[i] = right;
	                nums[i+1] = left;
	            }
	        }
	    }
	}

代码过于臃肿且耗时长.但还是能正确执行

还是看看人家的高赞回答吧

    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0)
            return;
        int index = 0;
        //一次遍历,把非零的都往前挪
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0)
                nums[index++] = nums[i];
        }
        //后面的都是0,
        while (index < nums.length) {
            nums[index++] = 0;
        }
    }

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2ba4i/?discussion=AJ2rEF
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java两数之和

  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
  • 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
	public int[] twoSum(int[] nums, int target) {
        int[] ints = new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length; j++) {
                if (nums[i] + nums[j] == target && i != j){
                    ints[0] = i;
                    ints[1] = j;
                    return ints;
                }
            }
        }
        return ints;
    }

代码运行依旧臃肿耗时长.还是来看看别人的高赞回答

    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> m = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (m.get(target - nums[i]) != null) {
                return new int[]{m.get(target - nums[i]), i};
            }
            m.put(nums[i], i);
        }
        return new int[]{0, 0};
    }

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2jrse/?discussion=bsiO6a
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

有效的数独

旋转图像

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值