一、两数之和

1.1 题目描述

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

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

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

1.2 解题思路

有目标数,又限制是两个数之和,所以知道若一个数为nums[i],则另一个数为target-nums[i]。

借助Map的数据结构,key为nums[i],value为i。

则答案应符合i、map.get(target-nums[i])。

1.3 解法

时间复杂度为\(O(n)\)

空间复杂度为\(O(n)\)


public class Solution { public static int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
int[] result = new int[2];
result[0] = map.get(target-nums[i]);
result[1] = i;
return result;
}else{
map.put(nums[i],i);
}
} return null;
} }

代码进一步简化

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

二、两数相加

2.1 题目描述

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

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

2.2 解题思路

思路是使用链表,定义变量sum来计算两条链表的对应节点的值,对sum%10作为新节点的值,sum/10判断是否进位。两条链表对应节点相加,若最后sum/10等于1,则新创建一个节点,放在尾部。

2.3 解法

时间复杂度为\(O(n)\)

空间复杂度为\(O(n)\)


class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
ListNode p1 = l1,p2=l2;
int sum = 0;
while(p1 != null || p2 != null){
if(p1 != null){
sum += p1.val;
p1 = p1.next;
}
if(p2 != null){
sum += p2.val;
p2 = p2.next;
}
cur.next = new ListNode(sum % 10);
sum /= 10;
cur = cur.next;
}
if(sum == 1){
cur.next = new ListNode(1);
}
return dummy.next;
}
}

三、无重复字符的最长子串

3.1 题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

3.2 解题思路

使用HashMap存储字符和位置

使用一个变量res记录当前最大无重复长度

使用一个变量i记录当前遍历的index

使用一个变量j计算当前无重复的起始值

如果当前的元素在map中已经存在了,则j在原先的重复字符的位置上往后挪一位

j = max(j,map.get(a)+1)

重新计算最大无重复字符个数

res = max(res,i-j+1)

3.3 解法

时间复杂度为\(O(n)\)

空间复杂度为\(O(n)\)


class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> map = new HashMap<>();
int res = 0;
for (int i = 0, j = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
j = Math.max(j, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
res = Math.max(res, i - j + 1);
}
return res;
}
}

四、寻找两个有序数组的中位数

4.1 题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

则中位数是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

十一、寻找两个有序数组的中位数

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

11.2 解题思路

11.3 解法


class Solution {
public int maxArea(int[] height) {
int l = 0;
int r = height.length - 1;
int maxArea = 0;
while (l < r) {
int maxHeight = height[l] < height[r] ? height[l] : height[r];
int area = maxHeight * (r - l);
if (area > maxArea) {
maxArea = area;
}
if (height[l] < height[r]) {
l++;
} else {
r--;
}
}
return maxArea;
}
}

二十、有效的括号


给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

20.3 解法


import java.util.Stack; /**
* @author Michael Fang
* @since 2019-08-08
*/
public class Solution { public boolean isValid(String s) {
char[] charArray = s.toCharArray();
Stack stack = new Stack();
for (char c : charArray) {
if (stack.isEmpty()) {
stack.add(c);
continue;
}
String result = String.valueOf(stack.peek()) + String.valueOf(c);
if (result.equals("{}") || result.equals("[]") || result.equals("()")) {
stack.pop();
} else {
stack.add(c);
}
}
return stack.isEmpty();
} }

参考文档

[1]: LeetCode官网

[2]: 花花酱LeetCode

算法练习 —— LeetCode 1-20题的更多相关文章

  1. leetcode第20题--Valid Parentheses

    Problem: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if ...

  2. LeetCode第[20]题(Java):Valid Parentheses

    题目:有效的括号序列 难度:Easy 题目内容: Given a string containing just the characters '(', ')', '{', '}', '[' and ' ...

  3. LeetCode第20题

    LeetCode20题不多说上代码 public boolean isValid(String s){ Stack<Character> stack = new Stack<Char ...

  4. LeetCode 第20题--括号匹配

    1. 题目 2.题目分析与思路 3.代码 1. 题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...

  5. LeetCode第20题:有效的括号

    问题描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空 ...

  6. LeetCode 第70题动态规划算法

    导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...

  7. LeetCode第[18]题(Java):4Sum 标签:Array

    题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...

  8. LeetCode第[1]题(Java):Two Sum 标签:Array

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  9. LeetCode每天一题之两数之和

    这个LeetCode刷题系列的博客权当是为自己记一下笔记吧.博客系列会从LeetCode的第一题开始刷,同时会从零开始学习[因为我就是零/(ㄒoㄒ)/~~].同时,如果有写错的地方,希望大佬们在评论区 ...

  10. leetcode第三题

    leetcode第三题: 题目: 给定一个字符串,找出不含有重复字符的最长子串的长度. 源码(使用java语言): class Solution { public int lengthOfLonges ...

随机推荐

  1. VBA错误处理(十八)

    在(VBScript/VBA)编程中有三种类型的错误: 语法错误 运行时错误 逻辑错误 语法错误 语法错误(也称为解析错误)发生在VBScript的解释时间. 例如,下面一行导致语法错误,因为它缺少一 ...

  2. Android状态栏和导航栏

    1.隐藏状态栏或导航栏 View decordView = getWindow().getDecorView(); /*SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI ...

  3. 【DELL存储】EMC会议 超融合+存储

    场景:盐城工厂 IT人数 4个人  机房200台 主要以虚拟化为主 实体机 PG ORACAL MYSQL dell产品线 提供整体方案 架构 针对整车厂 :传统+超融合 1. 介绍产品 1.1 超融 ...

  4. 用js刷剑指offer(二叉树中和为某一值的路径)

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  5. 上传文件(lrzsz)

    执行命令:yum -y install lrzsz 现在就可以正常使用rz.sz命令上传.下载数据了. 上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. 下载文件,执行命令sz

  6. Vue实现一个图片懒加载插件(转载)

    Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: &l ...

  7. 安装pytest

    1.安装pytest 2.执行一个用例 进入测试用例目录下,运行以test开头的一个用例. 执行成功. 备注:1.其实测试函数或方法只要以test开头就可以被运行的2.测试文件的名字,其实可以是任意的 ...

  8. python练习题(二)

    题目: 已知以下几期双色球号码(最后一个数字为蓝球), 2019080 03 06 08 20 24 32 07 2019079 01 03 06 09 19 31 16 2019078 01 17 ...

  9. mysqlcheck(MyISAM表维护工具)

    mysqlheck [option] db_name [tables] -c --check(检查表) -r  --repair(修复表) -a  --analyze(分析表) -o  --optim ...

  10. tomcate环境搭建

    Tomcat 环境搭建 最近在工作之余,看到了一些 Tomcat 的基础资料,感觉蛮好.同时也回忆起自己刚毕业要参加工作那会对 Tomcat 也是各种资料各种查,实属不易.为此,针对最近整理的一些基础 ...