《剑指Offer》笔记题解思路技巧优化_Part_7

《剑指Offer》笔记&题解&思路&技巧&优化_Part_7

  • 😍😍😍 相知
  • 🙌🙌🙌 相识
  • 😢😢😢 开始刷题
    • 🟢1. LCR 179. 查找总价格为目标值的两个商品——和为s的两个数字
    • 🟢2. LCR 180. 文件组合——和为s的连续正数序列
    • 🟢3. LCR 181. 字符串中的单词反转——翻转单词顺序
    • 🟢4. LCR 182. 动态口令——左旋转字符串
    • 🔴5. LCR 183. 望远镜中最高的海拔——滑动窗口的最大值
    • 🟡6. LCR 185. 统计结果概率——n个骰子的点数
    • 🟢7. LCR 186. 文物朝代判断——扑克牌中的顺子
    • 🟢8. LCR 187. 破冰游戏——圆圈中最后剩下的数字
    • 🟡9. LCR 188. 买卖芯片的最佳时机——股票的最大利润
    • 🟡10. LCR 189. 设计机械累加器——求1+2+n
    • 🟢11. LCR 193. 二叉搜索树的最近公共祖先——二叉搜索树的最近公共祖先

在这里插入图片描述

😍😍😍 相知

刷题不要一上来就直接干,先看题,明白题说的什么意思,然后想一下用什么现成的算法和数据结构可以快速解决,如果还是无从下手,建议先去看视频,不要直接翻评论或官方代码实现,看完视频,自己在idea中模拟敲几遍代码,如果跑通了,先别急着上leetcode黏贴,而是再回顾一下要点,然后确定自己完全懂了后,在leetcode中手敲,注意是手敲下来!!! 目前我就是采用的这种方法,虽然慢,但是可以维持一周忘不掉它,如果要想长期不忘,只能隔段时间就review一下了,就算是大牛,知道方法,长时间不碰,也不可能保证一次到位把代码敲完一遍过!!!

这是我上一篇博客的,也希望大家多多关注!

  1. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_1
  2. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_2
  3. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_3
  4. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_4
  5. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_5
  6. 《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_6

🙌🙌🙌 相识

根据题型可将其分为这样几种类型:

  1. 结构概念类(数组,链表,栈,堆,队列,树)
  2. 搜索遍历类(深度优先搜索,广度优先搜索,二分遍历)
  3. 双指针定位类(快慢指针,指针碰撞,滑动窗口)
  4. 排序类(快速排序,归并排序)
  5. 数学推理类(动态规划,数学)

😢😢😢 开始刷题

🟢1. LCR 179. 查找总价格为目标值的两个商品——和为s的两个数字

题目跳转:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/description/

class Solution {
    public int[] twoSum(int[] price, int target) {
        int left = 0;
        int right = price.length-1;
        while(left<right){
            if(target-price[left]==price[right])
            	return new int[]{price[left],price[right]};
            else if(target-price[left]<price[right]) right--;
            else left++;
        }
        return null;
    }
}

🟢2. LCR 180. 文件组合——和为s的连续正数序列

题目跳转:https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/description/

class Solution {
    public int[][] fileCombination(int target) {
        if(target<=2)return new int[0][0];
        //思路,双指针
        //刚开始 left 在位置 1, right 在位置 2, 定义左右指针之间的数字和为 sum = n*(a1+an)/2
        //1.类似二分查找的逻辑,当 sum 等于 target 时,将左右指针之间的这种数组加入结果,然后左指针右移
        //2.当 sum 小于 target 时,右指针右移增大 sum
        //3.当 sum 大于 target 时,说明以 left 为起点组成的数组不符要求,左指针右移

        //创建结果数组
        List<int[]> list = new ArrayList<>();

        int left = 1;
        int right = 2;

        //终止条件是左指针移动到右指针位置,说明此时已经不存在两个数之和能小于 target 了
        while (left < right) {

            int sum = (right - left + 1) * (left + right) / 2;

            if (sum == target) {
                //创建数组存储左右指针之间的数组组合
                int[] tmp = new int[right - left + 1];

                for (int i = 0; i < right - left + 1; i++) {
                    tmp[i] = left + i;
                }

                //将临时数组结果存储入List
                list.add(tmp);

                //继续探索下一种方案
                ++left;
            }else if (sum<target){
                ++right;
            }else {
                ++left;
            }

        }
        
        //掌握此种二维list转数组方法
        return list.toArray(new int[list.size()][]);
    }

}

🟢3. LCR 181. 字符串中的单词反转——翻转单词顺序

题目跳转:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/description/

class Solution {
    public String reverseMessage(String message) {
        message = message.trim();
        String [] temp = message.split("\\s+");
        StringBuilder stringbuilder = new StringBuilder();
        for(int i = 0;i<temp.length;i++){
            stringbuilder.append(temp[temp.length-1-i]);
            if(i!=temp.length-1)stringbuilder.append(" ");
        }

        return stringbuilder.toString();
    }
}

🟢4. LCR 182. 动态口令——左旋转字符串

题目跳转:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/description/

class Solution {
    public String dynamicPassword(String password, int target) {
        String temp = password.substring(0,target);
        StringBuilder stringBuilder = new StringBuilder(password.substring(target,password.length()));
        stringBuilder.append(temp);
        return stringBuilder.toString();
    }
}

🔴5. LCR 183. 望远镜中最高的海拔——滑动窗口的最大值

题目跳转:https://leetcode.cn/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/description/

在这里插入图片描述

class Solution {
    public int[] maxAltitude(int[] heights, int limit) {
        if(heights.length==0||limit==0) return new int [0];
        int [] result = new int[heights.length-limit+1];
        LinkedList<Integer> queue = new LinkedList<>();
        int index = 0;
        for( int i =0;i <heights.length;i++){
            
            while(!queue.isEmpty()&&heights[queue.peekLast()]<=heights[i]){
                queue.pollLast();
            }
            queue.add(i);
            if(queue.peekLast()-limit==queue.peek()){
                queue.poll();
            }
            if(i + 1 >= limit){
                result[index++] = heights[queue.peek()];
            }
        }
        return result;
    }
}

🟡6. LCR 185. 统计结果概率——n个骰子的点数

题目跳转:https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/description/

在这里插入图片描述

class Solution {
    public double[] statisticsProbability(int num) {
        double[] result=new double[5*num+1];
        int[][] dp = new int[num+1][6*num+1];
            for(int i = 1; i <= 6; i++){
            dp[1][i] = 1;
        }
        for(int i = 2;i <= num;i++){
            for(int j = i;j<=6*i;j++){
                for(int k = 1;k<=6;k++){
                    if(j < k)break;
                    dp[i][j] += dp[i-1][j-k];
                }
            }
        }
        int index = 0;
        double sum = Math.pow(6,num);

        for(int i = num;i<=6*num;i++){
            result[index++] = dp[num][i]/sum;
        }
        return result;

    }
}

🟢7. LCR 186. 文物朝代判断——扑克牌中的顺子

题目跳转:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/description/

class Solution {
    public boolean checkDynasty(int[] places) {
        Arrays.sort(places);
        int left = 0;
        int right =4;
        while(left<right){
            if(places[right]==0)return true;
            if(places[right]-1==places[right-1]){
                right--;
                continue;
            }
            if(places[left]==0){
                left++;
                places[right] = places[right]-1;
                continue;
            }
            else{
                return false;
            }
        }
        return true;
    }
}

🟢8. LCR 187. 破冰游戏——圆圈中最后剩下的数字

题目跳转:https://leetcode.cn/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/description/

/*
    思路:使用数学方法(先举例)
            你要知道最后的结果是3,带着结果去看问题

        第一次,【0, 1, 2, 3, 4】,本轮要踢出2                                  看3
        (下一轮开始从3计数,为了方便读者看出规律,将开始计数的那一位移到开头)
        第二次,【3, 4, 0, 1】,本轮要踢出0                                     看1
        第三次,【1, 3, 4】,本轮要踢出4                                        看1
        第四次,【1, 3】 本轮要踢出1                                            看3
        第五次,【3】
        最后返回3

        我们要使用的数学方法,就是从结果0号位置,反推最开始在哪
        你从第二次,向上看第一次
        你会发现,原来3在0的位置
                现在,3在(0 + 3) % 5
                        => +3 回到上次的位置
                        => %5 防止数组溢出,并且数组本来就是循环数组

        f(n) = ( f(n - 1) + m ) % n
        解释意思:
            f(n) 表示上一次
            f(n - 1) 表示这次,因为我们要从这次回推上一次
            m 表示隔几个
            n表示上一次的数组长度

     */
class Solution {
    public int iceBreakingGame(int num, int target) {
        int res = 0;// 最后只剩下一位,坐标肯定是0
        for (int i = 2; i <= num; i++) {
            res = (res + target) % i;
        }
        return res;
    }
}

🟡9. LCR 188. 买卖芯片的最佳时机——股票的最大利润

题目跳转:https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/description/

class Solution {
    public int bestTiming(int[] prices) {
        if(prices.length<2)return 0;
        int max = 0;
        int [] result = new int[prices.length];
        result[prices.length-1]=0;
        for(int i = prices.length-2;i>=0;i--){
            result[i] = Math.max(result[i+1],prices[i+1]);
            max = Math.max(max,result[i]-prices[i]);
        }
        return max;
    }
}
class Solution {
    public int bestTiming(int[] prices) {
        int cost = Integer.MAX_VALUE, profit = 0;
        for (int price: prices) {
            cost = Math.min(cost, price);
            profit = Math.max(profit,price-cost);
        }
        return profit;
    }
}

🟡10. LCR 189. 设计机械累加器——求1+2+n

题目跳转:https://leetcode.cn/problems/qiu-12n-lcof/description/

等差数列求和公式

class Solution {
    
    public int sumNums(int n) {
        return (int) (Math.pow(n, 2) + n) >> 1;
    }
}

递归

class Solution {

    public int sumNums(int n) {
        int sum = n;
        boolean flag = n > 0 && (sum += sumNums(n - 1)) > 0;
        return sum;
    }
}

异常

class Solution {
    int[] temp = {0};
    public int sumNums(int n) {
        try {
            // n不等于0的时候都会报错,进入catch方法
            return temp[n];
        } catch(Exception e) {
            return n + sumNums(n-1);
        }
    }
}

🟢11. LCR 193. 二叉搜索树的最近公共祖先——二叉搜索树的最近公共祖先

题目跳转:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/description/

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    if (root == null)
        return null;
    
    if (root.val > p.val && root.val > q.val)
        return lowestCommonAncestor(root.left, p, q);
    if (root.val < p.val && root.val < q.val)
        return lowestCommonAncestor(root.right, p, q);

    return root;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403798.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ocr识别tesseract.js本地复现

来源&#xff1a; https://github.com/naptha/tesseract.js chatgpt今天帮倒忙&#xff0c;一直给一些旧的东西&#xff0c;代码就老报错&#xff0c;最后还是我出面看看log和err调了一下&#xff0c;还的是我啊 复现效果 这个挺好复现的&#xff0c;用的英文模式比中文识别…

Matlab/simulink光伏发电的扰动观察法MPPT仿真(持续更新)

1.光伏发电的电导增量法MPPT仿真 2.光伏发电的恒定电压法MPPT仿真 3.光伏发电的扰动观察法MPPT仿真 4.光伏发电的占空比法MPPT仿真 5.基于神经网络的MPPT光伏发电仿真 6. 基于模糊控制的MPPT光伏发电仿真 7. 基于粒子群算法&#xff08;PSO&#xff09;的500w光伏系统MPPT控…

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本&#xff0c;该脚本可以提升数据分类的速度&#xff0c;并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞&#xff0c;Douglas-042会将注意力放在…

小程序商城 免 费 搭 建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用…

ELF文件内容详解——各节内容分析

文章目录 写在前面准备.text节.data节.strtab.symtab.shstrtab.shstrtab之后 写在前面 只看readelf这个工具说实话我感觉还是有点云里雾里&#xff0c;这里就逐字节分析一下ELF文件中text节&#xff08;代码段&#xff09;的内容 本文分析使用的汇编程序ELF文件内容详解这篇文…

苍穹外卖Day02——总结2

前期文章 文章标题地址苍穹外卖Day01——总结1https://blog.csdn.net/qq_43751200/article/details/135466359?spm1001.2014.3001.5501苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412 总结2 前期文章1. 新增员工模块1.1 …

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

CSS 字体和文本详解

CSS 字体和文本详解 字体设置 如果字体名有空格&#xff0c;使用引号包裹。建议使用常见字体&#xff0c; 否则兼容性不好。字体名称可以用英文&#xff0c;也可以用中文&#xff0c; 推荐使用英文。 示例代码: 运行结果: 字体大小 不同的浏览器默认字号不一样&#xff0c;…

学习Redis基础篇

1.初识Redis 1.认识NoSQL 2.认识Redis 3.连接redis命令 4.数据结构的介绍 5.通用命令 2.数据类型 1.String类型 常见命令&#xff1a;例子&#xff1a;set key value

vue-nextTick(nextTick---入门到离职系列)

官方定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 个人理解 假设我们更改了某个 dom 元素内部的文本&#xff0c;而这时候我们想直接打印这个更改之后的文本是需要 dom 更新之后才会实现的。 小案例 <tem…

NestJS入门2:创建模块

前文参考&#xff1a; NestJS入门1 1. 创建user模块 在项目目录下输入以下命令 nest g resource user 执行完后会在src文件夹下创建出user文件夹及文件夹下相应的文件&#xff0c;如下 2. 增加打印 3. 测试 &#xff08;1&#xff09;POSTBody Postman 服务端的打印 &…

关于在分布式环境中RVN和使用场景的介绍4

简介 在前面的文档中&#xff0c;我们介绍了RVN的概念&#xff0c;通过RVN可以解决的某类问题和使用技巧&#xff0c;以及处理RVN的逻辑的具体实现。在本文中&#xff0c;我们将要介绍关于如何使用RVN解决另一种在分布式系统中常出现的问题。 问题 假设我们创建了一个servic…

人工智能技术基础,AI技术基础知识,人工智能技术详解,无人机识别技术基础

什么是人工智能&#xff1f; 人工智能是计算机科学的一个分支&#xff0c;缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是研究使计算机来模拟人的某些思维过程和智能行为&#xff08;如学习、推理、思考、…

APP的UI自动化demo(appium+java)

文章目录 appium连接手机java代码实现-第一版第二版-接入testng和隐式等待显示等待 appium连接手机 准备工作 1、查看连接手机模拟器是否连接成功&#xff0c;获取设备名称 执行命令&#xff1a;adb devices 2、查看android内核版本号—>paltformVersion 执行命令&#xf…

企业微信变更企业主体的流程

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

【数据结构】顺序表实现的层层分析!!

关注小庄 顿顿解馋◍˃ ᗜ ˂◍ 引言&#xff1a;本篇博客我们来认识数据结构其中之一的顺序表&#xff0c;我们将认识到什么是顺序表以及顺序表的实现&#xff0c;请放心食用~ 文章目录 一.什么是顺序表&#x1f3e0; 线性表&#x1f3e0; 顺序表 二.顺序表的实现&#x1f3e0…

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下 为什么要进行主从复制主从复制的原理主从复制执行流程操作步骤主库创建从库创建 测试 为什么要进行主从复制 在业务中通常会有情况&#xff0c;在sql执行时&#xff0c;将表锁住&#xff0c;导致不能进行查询&#xff0c;这样就会影响业务的…

Window部署Exceptionless

Exceptionless Elasticsearch 版本&#xff1a; Exceptionless&#xff1a;8.1.0 Elasticsearch&#xff1a;7.17.5 JDK&#xff1a;11.0.10 目录 一、Elasticsearch运行 二、 Exceptionless 一、Elasticsearch运行 bin目录下elasticsearch.bat 直接运行 访问 http://lo…

Google发布开放的模型Gemma

今天&#xff0c;Google 发布了一系列最新的开放式大型语言模型 —— Gemma&#xff01;Google 正在加强其对开源人工智能的支持&#xff0c;我们也非常有幸能够帮助全力支持这次发布&#xff0c;并与 Hugging Face 生态完美集成。 Gemma 提供两种规模的模型&#xff1a; 7B …