IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 用通俗易懂的方法来讲解算法(Java版) -> 正文阅读

[数据结构与算法]用通俗易懂的方法来讲解算法(Java版)

前言

提示:用前必看:

IT行业迅速发展,作为一个程序员,掌握算法更是必不可缺的技能,本文章将讲解Java版Leetcode从基础到加深算法以及思路,有的可能会有多种答题思路,包括暴力法和官方解答并附相关网址,欢迎小白提问,本文章讲持续更新中…。


一.两数之和(简单)

二.两数相加(中等)

三.无重复字符的最长子串(中等)

提示:以下是本篇文章正文内容,下面案例可供参考

1.两数之和(简单)

1.问题

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
https://leetcode.cn/problems/two-sum/

示例

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

2.解题思路

F1:正常思路(暴力破解):嵌套两层遍历,外层从下标为0开始,内从从1开始,当nums[i]+nums[j] == target 跳出循环,时间复杂度O(n2)

F2:官方思路:首先声明一个Map,key用来存这个数组的值,value来存数组的下表,当遍历数组的时候,如果map 包含key 为target - nums[i]的时候,说明找到了,如果不包含,把nums[i]存进map,即 map.put(nums[i], i);
继续下次循环,直到if成立,时间复杂度为O(n)

3.上代码

F1:

     public int[] twoSum(int[] nums, int target) {

            for (int k = 0; k < nums.length - 1; k++) {
                for (int l = k+1; l < nums.length ; l++) {
                    if (nums[k] + nums[l] == target) {
                        return new int[]{k, l};
                    }
                }
            }
            return new int[0];
        }

F2:

 public int[] twoSum(int[] nums, int target) {
            HashMap<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};
                }
                //注意 key存值,value存下标
                map.put(nums[i], i);
            }
            return new int[0];
        }

二.两数相加(中等)

1.问题

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

在这里插入图片描述

示例

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

2.解题思路

F1:官方思路:首先需要创建节点类,包含属性为:值,下一个节点两个属性,一个构造方法参数为val,准备工作做好后,然后编写方法,由题意可知,其实目的是两个链表同时进行,每个链表从0下标开始,相加,余数就是这个节点的值,如果超过10 是需要进位的,需要有变量存起来,在下次循环中加上这个值,最后在遍历完,如果进位值还有值(只可能是1或者0,0就不用管了),则新增一个next节点存该值,切记,每次node循环完,都需node=node.next ,来跳到下一个节点。

3.上代码

F1:

  public class AddTwoNumbers {
    public static void main(String[] args) {
        ListNode listNode = new AddTwoNumbers().new ListNode(1);
        listNode.next = new AddTwoNumbers().new ListNode(2);
        listNode.next.next = new AddTwoNumbers().new ListNode(3);

        ListNode listNode2 = new AddTwoNumbers().new ListNode(2);
        listNode2.next = new AddTwoNumbers().new ListNode(9);
        listNode2.next.next = new AddTwoNumbers().new ListNode(9);
        ListNode resultNode = new AddTwoNumbers().new Solution().addTwoNumbers(listNode, listNode2);
        while (resultNode != null){
            System.out.print(resultNode.val);
            resultNode = resultNode.next;
        }
    }
    //leetcode submit region begin(Prohibit modification and deletion)

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


class Solution {
    public ListNode addTwoNumbers(ListNode node1, ListNode node2) {
        //res存放结果,cur为res的尾指针
        ListNode res = new ListNode();
        ListNode cur = res;
        //表示进位
        int carry = 0;
        // 只要两个链表有一个不为空,就要继续
        while (node1 != null || node2 != null){
            //如果其中有一个到达结尾了,那么这个链表这一位的的数字就为0。
            int a = node1 == null ? 0 : node1.val;
            int b = node2 == null ? 0 : node2.val;
            //两个链表的两位相加
            int sum = a + b + carry;
            //大于10进位 进位数是下次循环要被加起来的
            carry = sum / 10;
            //进位完剩下的余数,余数就是值
            sum %= 10;
            //创建一个节点接入res后面
            cur.next = new ListNode(sum);
            cur = cur.next;
            //分别后移
            if (node1 != null) node1 = node1.next;  // 跳到下一个节点
            if (node2 != null) node2 = node2.next;  // 跳到下一个节点
        }
        //如果最后还有进位的话,增加一个节点(比如三位数相加高位超过10变成四位,第四位必为1)
        if (carry == 1) cur.next = new ListNode(1); 
        return res.next;
    }
   
}
//leetcode submit region end(Prohibit modification and deletion)

}

三.无重复字符的最长子串(中等)

1.问题

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
https://leetcode.cn/problems/longest-substring-without-repeating-characters/

示例

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串

2.解题思路

F1:官方思路:其实这个跟两数之和有共通之处,都是借用了map的key存值,value存下标,由题意知,是要一个无重复字符串的最长字符数,比如abba,当碰到第二个b的时候就是说明遇到重复了,所以我们需要定义两个变量,max代表最大值,left代表用来滑动窗口,当遇到第二个b的时候,left就要变成b+1那个位置,max也是取最大值,

3.上代码

F1:

public class LongestSubstringWithoutRepeatingCharacters {
    public static void main(String[] args) {
        Solution solution = new LongestSubstringWithoutRepeatingCharacters().new Solution();
        System.out.println( solution.lengthOfLongestSubstring("abba"));;
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        //abcbcbb
    public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        int max = 0; //用来存返回的最长无重复子串的数字
        int left = 0; //用来滑动窗口
        Map<Character,Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left,map.get(s.charAt(i))+1);
            }
            map.put(s.charAt(i),i);
            max = Math.max(i-left+1,max);
        }
        return max;
    }

        public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        int max = 0; //用来存返回的最长无重复子串的数字
        int left = 0; //用来滑动窗口
        Map<Character,Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if(map.containsKey(s.charAt(i))){
                //map.get(s.charAt(i)) get key会拿到第二个b的定位,+1 是要left变成b的后一个位置
                left = Math.max(left,map.get(s.charAt(i))+1);
            }
            //key存值,value存下标
            map.put(s.charAt(i),i);
            // max取最大值,是之前的max大还是新的循环i-keft+1大
            max = Math.max(i-left+1,max);
        }
        return max;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}

总结

提示:持续更新中!!!

有惊喜哟~
在这里插入图片描述

关注公众号,随时学习最新内容,并与博主零距离交流!
持续更新中。。。
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:55:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:49:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码