LeetCode刷题1-50

01:两数之和

两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

  • 暴力破解法
public class threeNumSum {
    public static void main(String[] args) {
        int num[] ={2,7,11,15};
        int[] ints = twoSum(num, 9);
        System.out.println(Arrays.toString(ints));
    }
    //暴力破解
    public static int[] twoSum(int[] nums, int target) {
        int res[] =new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i]+nums[j]==target){
                    res[0]=j;
                    res[1]=i;
                }
            }
        }
        return res;
    }
}
  • hash表
public class threeNumSum {
    public static void main(String[] args) {
        int num[] ={2,7,11,15};
        int[] ints = twoSum(num, 9);
        System.out.println(Arrays.toString(ints));
    }
    //哈希表实现
    public static int[] twoSum(int[] nums, int target) {
        int res[] =new int[2];
        HashMap<Integer,Integer> map = new HashMap<>();
        //用HashMap来存储数据,其中key是数组中的元素,value为数组中元素的索引值
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],i);
        }
        for (int i = 0; i < nums.length; i++) {
           int other = target-nums[i];
           if (map.containsKey(other) && map.get(other) != i){
                res[0] = i;
                res[1] = map.get(other);
                break;
            }
        }
        return res;
    }
}
  • hash表方法优化
public class threeNumSum {
    public static void main(String[] args) {
        int num[] ={2,7,11,15};
        int[] ints = twoSum(num, 9);
        System.out.println(Arrays.toString(ints));
    }
    //哈希表实现优化(少了一次存储map,代码做到简化)
    public static int[] twoSum(int[] nums, int target) {
        //int res[] =new int[2];
        HashMap<Integer,Integer> map = new HashMap<>(nums.length-1);
        //用HashMap来存储数据,其中key是数组中的元素,value为数组中元素的索引值
        for (int i = 0; i < nums.length; i++) {
            //此时说明map中存在一个key+nums[i]=target
            if (map.containsKey(target-nums[i])){
                return new int[]{map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
        }
        return new int[0];
    }
}

02:两数相加

两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

* 示例
 * 输入:l1 = [2,4,3], l2 = [5,6,4]
 * 输出:[7,0,8]
 * 解释:342 + 465 = 807.

代码示例

package com.ghl.leecode;

/**
 * 两数相加
 * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
 * 请你将两个数相加,并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 示例
 * 输入:l1 = [2,4,3], l2 = [5,6,4]
 * 输出:[7,0,8]
 * 解释:342 + 465 = 807.
 */
public class TwoNumPlus02 {
    public static void main(String[] args) {
        ListNode l13 = new ListNode(3);
        ListNode l14 = new ListNode(4, l13);
        ListNode l1 = new ListNode(2, l14);
        //=========简单构造测试数据===============
        ListNode l24 = new ListNode(4);
        ListNode l26 = new ListNode(6, l24);
        ListNode l2 = new ListNode(5, l26);
        ListNode listNode = addTwoNumbers(l1, l2);
        System.out.println(listNode);
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return r(l1, l2, 0);
    }

    private static ListNode r(ListNode l1, ListNode l2, int add) {
        //此时代表l1,l2都到了最后一个节点且最后一位相加不超过10。即不需要再次计算
        if (l1 == null && l2 == null && add == 0){
            return null;
        }
        //此时l1或者l2到了最后节点,导致不能配合另一方计算条件,则默认为0至此计算
        int val1 = l1 == null ? 0 : l1.val;
        int val2 = l2 == null ? 0 : l2.val;
        //相对节点相加总数,add为上一位相加多出的余数
        int sum = val1 + val2 + add;
        //若对应节点相加不满足取余条件取相加结果即可,满足:取余如:7+8=15 留1把5给下一节点的相加额外值也就是add的值
        ListNode res = new ListNode(sum < 10 ? sum : sum % 10);
        //该轮计算完毕,两个链表节点后移,同时add变为sum/10 eg:15/10=1
        res.next = r(l1.next, l2.next, sum < 10 ? 0 : sum / 10);
        return res;
    }

    static class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }

        @Override
        public String toString() {
            return "ListNode{" +
                    "val=" + val +
                    ", next=" + next +
                    '}';
        }
    }
}

本篇所有题目来自于LeetCode

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值