leetcode-1-2

业余时间做一些题。

Two Sum

第一反应是用双重 for 循环,可是 O(N^2)的复杂度通不过校验,就改成如下方法了,时间复杂度为O(N)。

思路:

1、遍历数组,用 target 减去 nums[i] 得到差值,判断得到的差值是否在剩余的元素中(nums.slice(i+1))。

2、如果差值存在于数组中,就将 i 和 k(差值在剩余的元素中的索引)+ i + 1   push 进 result。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var i,
        k,
        diffIndex,
        len = nums.length,
        result = [];
    for(i = 0; i < len - 1; i++){
        k = i+1;
        diffIndex = nums.slice(k).indexOf(target - nums[i]);
        if(diffIndex !== -1){
            result.push(i, diffIndex + i + 1);
        }
    }
    return result;
};

Add Two Numbers

题目概览:

给出两个链表,然后计算两个链表的和。题目要求链表中每个节点包的数值都是一位的,高位需要加入到下一个节点中。

题目自带一个链表类的构造函数

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

分析:

其实这个题目,就是简单的加法。只不过我们数学中的加法是从右往左算,它是从左往右算。

如下所示:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

Input: (9 -> 9) + (1)
Output: 0 -> 0 -> 1

Input: (3 -> 7) + (9, 4)
Output: 2 -> 2 -> 1

思路:

1、new 一个空节点,对应着链表的头部,并赋值给一个临时变量 tempNode, tempNode 的作用是存储新节点。

2、while 循环,当 链表1 和 链表2 任意一个不为空时,执行循环中的代码。

3、把当前节点的 val 相加,注意 两个 val值的和大于10时,需要把高位加入到下一节点。

4、new 一个新节点,参数为上一步骤两个val的值取余10。

5、临时变量 tempNode 的 next 指向 新节点,然后再把 新节点 赋值给 tempNode, 这样的话,下次访问 tempNode.next ,就是访问新节点的 next 了。

6、链表1 和 链表2 移动到各自的下一个节点。回到第2步。

7、如果遍历完 2 个链表,最后的两个 val 值大于 10 的话,需要再 new 一个新节点。

8、妈蛋感觉自己的表达能力不够好,具体可以看文档 https://leetcode.com/articles/add-two-numbers/

代码:

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2){
    var l3 = new ListNode(),  //空节点
        tempNode = l3,
        tempVal1 = 0,
        tempVal2 = 0,
        sum = 0,
        carry = 0;

    while(l1 !== null || l2 !== null){
        tempVal1 = l1 !== null ? l1.val : 0;
        tempVal2 = l2 !== null ? l2.val : 0;
        sum = carry + tempVal1 + tempVal2;
        carry = parseInt( sum / 10 );          //例如 sum = 4 + 6, 则 sum / 10 等于 1, 下一位数字需要加 1。

        tempNode.next = new ListNode( sum % 10 );
        tempNode = tempNode.next;                   //把新节点赋值给 tempNode

        if(l1 !== null) l1 = l1.next;
        if(l2 !== null) l2 = l2.next;
    }

    //如果最后一个节点后,carry > 0, 则再添加一个节点
    if(carry >  0){
        tempNode.next = new ListNode( carry );
    }

    return l3.next;
};
时间: 2024-08-28 01:08:29

leetcode-1-2的相关文章

[LeetCode] 349 Intersection of Two Arrays &amp; 350 Intersection of Two Arrays II

这两道题都是求两个数组之间的重复元素,因此把它们放在一起. 原题地址: 349 Intersection of Two Arrays :https://leetcode.com/problems/intersection-of-two-arrays/description/ 350 Intersection of Two Arrays II:https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ 题目&解法

LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

LeetCode 10. Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/description/ Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover

(leetcode题解)Pascal&#39;s Triangle

Pascal's Triangle  Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题意实现一个杨辉三角. 这道题只要注意了边界条件应该很好实现出来,C++实现如下 vector<vector<int>> generate(int

[LeetCode]Count Primes

题目:Count Primes 统计1-n的素数的个数. 思路1: 通常的思想就是遍历(0,n)范围内的所有数,对每个数i再遍历(0,sqrt(i)),每个除一遍来判断是否为素数,这样时间复杂度为O(n*sqrt(n)). 具体实现不在贴代码,过程很简单,两重循环就可以解决.但是效率很差,n较大时甚至会花几分钟才能跑完. 思路2: 用埃拉特斯特尼筛法的方法来求素数,时间复杂度可以达到O(nloglogn). 首先开一个大小为n的数组prime[],从2开始循环,找到一个质数后开始筛选出所有非素数

[LeetCode]Repeated DNA Sequences

题目:Repeated DNA Sequences 给定包含A.C.G.T四个字符的字符串找出其中十个字符的重复子串. 思路: 首先,string中只有ACGT四个字符,因此可以将string看成是1,3,7,20这三个数字的组合串: 并且可以发现{ACGT}%5={1,3,2,0};于是可以用两个位就能表示上面的四个字符: 同时,一个子序列有10个字符,一共需要20bit,即int型数据类型就能表示一个子序列: 这样可以使用计数排序的思想来统计重复子序列: 这个思路时间复杂度只有O(n),但是

Leetcode 给一个数a和一个向量b,找出该向量b中的2个数相加等于a,并输出这两个数在向量中的位置

看C++primer Plus看的无聊,第一次做Leetcode的练习,本来想做二维向量的,结果始终通不过,查了原因,必须用一维的... 一维的答案: class Solution {  public:   vector<int> twoSum(vector<int>& nums, int target)   {    int cout = nums.size();  //得到向量的大小    vector<int>ret;  //定义向量      for (