ARTS Week 2

Posted 萌新阿岩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARTS Week 2相关的知识,希望对你有一定的参考价值。

Algorithm

本周的 LeetCode 题目为 1. 两数之和

题目简介

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

示例 :

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

题目思路

题目的思路很简单,遍历数组,查找 target - nums[0] 是否在数组 nums 中,若在返回 0 和它的下标,若不在,查找下一个,即 target-nums[1] 是否在数组中,直至找到停止。为了快速查找 target-nums[i],可以记录下数组中的 值——索引 的对应关系。

最终代码

// 自己的写法
class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, HashSet<Integer>> numIndexMap = new HashMap<Integer, HashSet<Integer>>();
        for (int i = 0; i < nums.length; i++) {
            Integer num = nums[i];
            if (numIndexMap.containsKey(num) == false) {
                numIndexMap.put(num, new HashSet<Integer>());
                numIndexMap.get(num).add(i);
            } else {
                numIndexMap.get(num).add(i);
            }
        }
        int[] ans = new int[2];
        int index = 0;
        for (Integer key: numIndexMap.keySet()) {
            Integer goalKey = target - key;
            if (goalKey.equals(key) == true) {
                if (numIndexMap.get(goalKey).size() > 1) {
                    for (Integer temp: numIndexMap.get(goalKey)) {
                        ans[index] = temp;
                        index += 1;
                    }
                }
            } else {
                if (numIndexMap.containsKey(goalKey) == true) {
                    for (Integer temp: numIndexMap.get(key)) {
                        ans[0] = temp;
                    }
                    for (Integer temp: numIndexMap.get(goalKey)) {
                        ans[1] = temp;
                    }
                }
            }
        }
        return ans;
    }
}

但自己的写法较为复杂,官方的写法简略。实际上没有必要为每个元素都建立值—索引的映射关系,可以等到遍历的时候进行判断和建立。代码如下:

// 官方的写法
class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> numIndexMap = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            if (numIndexMap.containsKey(target - nums[i])) {
                return new int[]{numIndexMap.get(target - nums[i]), i};
            } else {
                numIndexMap.put(nums[i], i);
            }
        }
        return new int[2];
    }
}

Review

本周 Review 的英文文章为:Follow boring advice

这篇文章很短,作者分享了一些建议,这些建议在作者眼中是无聊枯燥的,我认为大部分是老调重谈。虽说其中很多相信大部分人早已听过,但做到却并不是那么容易,这就是知易行难。Review 这篇文章,一是希望能对大家有帮助,二是希望能提醒自己。

下面的就是作者分享的具体建议:

  • 行动(Action):无论什么事,先做起来。我们是由我们所做的事决定的,而不是所想的事定义的。任何不完美的行动都比一直思考它更好;
  • 连贯(Consistency):好事是建立在一个好习惯并在坚持它的过程中发生。如定期锻炼身体;
  • 迭代(Iteration):需要不时地停下来,反思,调整继续前进。一味地做而不去反思可能会在错误的道路上越走越远;
  • 复利(Compounding):复利不仅适用于金融领域,同样也适用于生活中,每个细微的改变也会随着时间推移产生巨大影响;
  • 刻意练习(Deliberate practice):如果想要提高某项能力,重要的是有意识的刻意训练它;
  • 专注(Focus):一次只做一件事,设立明确的目标,避免分心和冲动;
  • 分治法(Divide and conquer):将一个大的任务分割成一个个小的任务来完成;
  • 积极乐观和感激(Positivity and gratitude):对生活要保持积极乐观,对生活中的人要怀有感激之心。

Tip

快慢指针判断条件的细微差异。

快慢主要用在链表中,简单的说快慢指针就是慢指针一次只前进一步,而快指针一次会前进两步,这样快指针的就会先达到 null 后,停止循环。示例代码如下:

/**
 * Definition for singly-linked list.
 * 单链表定义
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

ListNode slow = head;
ListNode fast = head;
while (判断条件) {
	slow = slow.next;
	fast = fast.next.next;
}

判断条件有两种选择,分别为:

  • (fast != null) && (fast.next != null)
  • (fast.next != null) && (fast.next.next != null)

当判断条件是 (fast != null) && (fast.next != null) ,结束时慢指针所在的位置正好是后半部分的开始位置。示例如下:

1->2->3->4->5->null
s  s  s  s
f     f     f  f->end

1->2->3->4->null
s  s  s
f     f     f->end

而当判断条件是 (fast.next != null) && (fast.next.next != null) ,结束时慢指针后半部分的开始位置的前一个,即正中间的位置(总个数为奇数)或者是前半部分的最后一个(总个数为偶数)。示例如下:

1->2->3->4->5->null
s  s  s
f     f     f->end

1->2->3->4->null
s  s
f     f->end

Share

连续四个月在朋友圈和QQ空间分享月度总结,可以基本视为养成了习惯。虽说并没有会带来特别大的改变,但还是收获了不少,也感受到了一定的提升。每个评论的、点赞的人都可以视为监督者,感谢他们起到了监督自己、鞭策自己的作用,没有他们自己很可能会在某些方面上会放纵一些。

以上是关于ARTS Week 2的主要内容,如果未能解决你的问题,请参考以下文章

arts-week2

arts-week2

ARTS-week2

ARTS Week 20

ARTS Week 2

ARTS Week 26