LeetCode记录


title: LeetCode记录
date: 2019-03-17 12:46:21
categories:

  • 算法
    tags:
  • 算法

leetCode清单

解答

HashMap相关

  1. 两数之和

    • 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
      你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

    示例:
    给定 nums = [2, 7, 11, 15], target = 9

    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    • 思路
      从0开始遍历nums数组, 使用hashmap存放期望的值(target-nums[i])和索引值(i), 判断当前nums[i]是否是前面的需要的期望值, 如果是, 则代表找到了, 不是则继续下一次
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> ans = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            if(ans.containsKey(nums[i])){
                return new int[]{ans.get(nums[i]), i};
            }
            ans.put(target - nums[i], i);
        }
        return null;
    }
}
  1. 和为k的子数组

    • 题目
      给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
      示例 1 :
      输入:nums = [1,1,1], k = 2
      输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
      说明 :
      数组的长度为 [1, 20,000]。
      数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

    • 思路
      建立map表用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。

    sum的值是在对nums数组的循环中不断累加当前元素的,res的值则需要查找map中是否已存在sum-k的元素,也就是在查找此前所有从0项开始累加的连续子项和中有没有sum-k。

    如果有的话,则说明从该项到当前项的连续子数组和必定为k,那么res则可以和这个sum的对应值,即这个sum出现的次数,相加得到新的res。

    对于当前sum如果已存在与map中则其对应值+1,不存在则添加新项,初始值为1。

    class Solution {
        public int subarraySum(int[] nums, int k) {
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, 1);
            int res = 0;
            int sum = 0;
            for(int i = 0; i < nums.length; i++){
                sum += nums[i];
                //如果k = 13 而此时sum = 20, 所以sum - k = 7, 查看是否有出现过7, 如果有则代表从该项到当前项的连续子数组和为13, 将出现过的次数加到结果
                if(map.containsKey(sum - k)){
                    res += map.get(sum - k);
                }
                //因为这是一个包含负数的数组, 所有存在和为20的情况有很多种, 需要处理
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
            return res;
        }
    }
    

ListNode相关

  1. 两数相加

    • 题目
      给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            //定义一个进位标志
            int flag = 0;
            ListNode p1 = l1;
            ListNode p2 = l2;
            ListNode res = new ListNode(-1);
            ListNode cur = res;
            while(p1 != null || p2 != null){
                int x = (p1 != null) ? p1.val : 0;
                int y = (p2 != null) ? p2.val : 0;
                int sum = x + y + flag;
                flag = sum / 10;
                cur.next = new ListNode(sum % 10);
                cur = cur.next;
                if(p1 != null){
                    p1 = p1.next;
                }
                if(p2 != null){
                    p2 = p2.next;
                }
            }
            if(flag > 0){
                cur.next = new ListNode(flag);
            }
            return res.next;
        }
    }
    
  2. 两数相加2
    -题目
    给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

    你可以假设除了数字 0 之外,这两个数字都不会以零开头。

    进阶:

    如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

    示例:

    输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出: 7 -> 8 -> 0 -> 7

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<Integer> s1 = new Stack<>();
        Stack<Integer> s2 = new Stack<>();
        while(l1 != null || l2 != null){
            if(l1 != null){
                s1.push(l1.val);
                l1 = l1.next;
            }
            if(l2 != null){
                s2.push(l2.val);
                l2 = l2.next;
            }
        }
        int flag = 0;
        ListNode head = null;
        ListNode temp = null;
        while(!s1.empty() || !s2.empty()){
            int x = (!s1.empty()) ? s1.pop() : 0;
            int y = (!s2.empty()) ? s2.pop() : 0;
            int sum = x + y + flag;
            ListNode node = new ListNode(sum % 10);
            temp = head;
            head = node;
            head.next = temp;
            head = node;
            flag = sum / 10;
        }
        if(flag > 0){
            temp = head;
            head = new ListNode(1);
            head.next = temp;
        }
        return head;
    }
}
 = sum / 10;
        }
        if(flag > 0){
            temp = head;
            head = new ListNode(1);
            head.next = temp;
        }
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值