《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_5

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

  • 😍😍😍 相知
  • 🙌🙌🙌 相识
  • 😢😢😢 开始刷题
    • 🟢1. LCR 158. 库存管理 II——数组中出现次数超过一半的数字
    • 🟢2. LCR 159. 库存管理 III——最小的k个数
    • 🔴3. LCR 160. 数据流中的中位数——数据流中的中位数
    • 🟢4. LCR 161. 连续天数的最高销售额——连续子数组的最大和
    • 🔴5. LCR 162. 数字 1 的个数——1~n整数中1出现的次数
    • 🟡6. LCR 163. 找到第 k 位数字——数字序列中某一位的数字
    • 🟡7. LCR 164. 破解闯关密码——把数组排成最小的数
    • 🟡8. LCR 165. 解密数字——把数字翻译成字符串
    • 🟡9. LCR 166. 珠宝的最高价值——礼物的最大价值
    • 🟡10. LCR 167. 招式拆解 I——最长不含重复字符的子字符串

在这里插入图片描述

😍😍😍 相知

当你踏入计算机科学的大门,或许会感到一片新奇而陌生的领域,尤其是对于那些非科班出身的学子而言。作为一位非科班研二学生,我深知学习的道路可能会充满挑战,让我们愿意迎接这段充满可能性的旅程。

最近,我开始了学习《剑指Offer》和Java编程的探索之旅。这不仅是一次对计算机科学的深入了解,更是对自己学术生涯的一次扩展。或许,这一切刚刚开始,但我深信,通过努力与坚持,我能够逐渐驾驭这门技艺。

在这个博客中,我将深入剖析《剑指Offer》中的问题,并结合Java编程语言进行解析。

让我们一起踏上这段学习之旅,共同奋斗,共同成长。无论你是已经驾轻就熟的Java高手,还是像我一样初出茅庐的学子,我们都能在这里找到彼此的支持与激励。让我们携手前行,共同迎接知识的挑战,为自己的未来打下坚实的基石。

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

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

🙌🙌🙌 相识

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

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

😢😢😢 开始刷题

🟢1. LCR 158. 库存管理 II——数组中出现次数超过一半的数字

题目跳转:https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/description/

排序法

class Solution {public int inventoryManagement(int[] stock) {//复杂度O(nlgn)Arrays.sort(stock);return stock[stock.length/2];}
}

摩尔投票法
要投票当领导 依次遍历 我们知道众数的领导一定赢 如果不一样 就抵消!

在这里插入图片描述

class Solution {public int inventoryManagement(int[] stock) {if(stock.length <= 2){return stock[0];}int x = stock[0];int sum = 1;for(int i =1;i<stock.length;i++){if(sum == 0){x = stock[i];sum = 1;}else{if(x == stock[i]){sum++;} else {sum--;}}}return x;}
}

🟢2. LCR 159. 库存管理 III——最小的k个数

题目跳转:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/description/

排序

class Solution {public int[] inventoryManagement(int[] stock, int cnt) {if(cnt>=stock.length)return stock;Arrays.sort(stock);int[] result = new int [cnt];for(int i = 0;i<cnt;i++){result[i] = stock[i];}return result;}
}

学会个函数

class Solution {public int[] inventoryManagement(int[] stock, int cnt) {if(cnt>=stock.length)return stock;Arrays.sort(stock);return Arrays.copyOfRange(stock, 0, cnt);}
}

快排

class Solution {public int[] getLeastNumbers(int[] arr, int k) {if (k == 0 || arr.length == 0) {return new int[0];}// 最后一个参数表示我们要找的是下标为k-1的数return quickSearch(arr, 0, arr.length - 1, k - 1);}private int[] quickSearch(int[] nums, int lo, int hi, int k) {// 每快排切分1次,找到排序后下标为j的元素,如果j恰好等于k就返回j以及j左边所有的数;int j = partition(nums, lo, hi);if (j == k) {return Arrays.copyOf(nums, j + 1);}// 否则根据下标j与k的大小关系来决定继续切分左段还是右段。return j > k? quickSearch(nums, lo, j - 1, k): quickSearch(nums, j + 1, hi, k);}// 快排切分,返回下标j,使得比nums[j]小的数都在j的左边,比nums[j]大的数都在j的右边。private int partition(int[] nums, int lo, int hi) {int v = nums[lo];int i = lo, j = hi + 1;while (true) {while (++i <= hi && nums[i] < v);while (--j >= lo && nums[j] > v);if (i >= j) {break;}int t = nums[j];nums[j] = nums[i];nums[i] = t;}nums[lo] = nums[j];nums[j] = v;return j;}
}

🔴3. LCR 160. 数据流中的中位数——数据流中的中位数

题目跳转:https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/description/

直接重排变成有序数组 挺暴力的

class MedianFinder {List<Integer> list = null;/** initialize your data structure here. */public MedianFinder() {list = new ArrayList<>();}public void addNum(int num) {list.add(num);}public double findMedian() {Collections.sort(list);if(list.size() % 2 == 0){return (double)(list.get(list.size()/2 -1) + list.get(list.size()/2))/2.0;}else{return (double)list.get(list.size()/2);}}
}

大根堆和小根堆

在这里插入图片描述

class MedianFinder {Queue<Integer> min, max;/** initialize your data structure here. */public MedianFinder() {min = new PriorityQueue<>(); // ⼩根,保存较⼤的max = new PriorityQueue<>((x, y) -> (y - x));// ⼤根}public void addNum(int num) {// 如果是偶数if(min.size() == max.size()){min.add(num);max.add(min.poll());} else {max.add(num);min.add(max.poll());}}public double findMedian() {// 如果是偶数if(min.size() == max.size()){return (min.peek() + max.peek()) / 2.0;} else {return max.peek() * 1.0;}}
}

🟢4. LCR 161. 连续天数的最高销售额——连续子数组的最大和

题目跳转:https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/description/

class Solution {public int maxSales(int[] sales) {int[] maxsale = new int[sales.length];int sum = -101;maxsale[0] = sales[0];sum = Math.max(sum,maxsale[0]);for(int i = 1;i<sales.length;i++){if(maxsale[i-1]>=0){maxsale[i] = maxsale[i-1]+sales[i];}else{maxsale[i] = sales[i];}sum = Math.max(sum,maxsale[i]);}return sum;}
}

🔴5. LCR 162. 数字 1 的个数——1~n整数中1出现的次数

题目跳转:https://leetcode.cn/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/description/

给定一个整数 num,计算所有小于等于 num 的非负整数中数字 1 出现的个数。
示例 1:
输入:num = 0 输出:0 示例 2:
输入:num = 13 输出:6
解释:1(1次)、10(1次)、11(2次)、12(1次)、13(1次) 共 6次

如果你想的是这个,别想了 超时警告

class Solution {
public:int countDigitOne(int n) {int count = 0;for (int i = 1; i <= n; i++) {count += countOne(i);}return count;}int countOne(int n) {int num = 0;while (n) {if (n % 10 == 1) {num++;}n /= 10;}return num;}
};```
//3101592/**计算从1-n出现1的总次数*就是计算1-n所有整数 个位+十位+百位+..为1的总和*举个例子:把百位固定*3101 5 92  我们把百位 5>1 取出来 *5前面可以取0-3101,5后面可以取0-99*一共有(3101+1)*100(百位)种组合使百位为1**再举个例子:把千位固定*310 1 592  我们把千位1=1取出来 这里可以分两种情况:*  1前面可以取0-309时 1后面可以取0-999*  1前面取310,1后面可以取0-592*一共有(310)*1000(千位)+(592+1)种组合使千位为1*再举最后一个例子:把万位固定*31 0 1592,把万位0<1 前面可以取0-30,0后面可以取0-9999*一共有(31)*10000(万位)种组合使万位为1*我们可以分别计算一个数的个位百位...对应的组合数,最后相加*基本情况就是上面的例子,分别对应的位元素 是大于1,等于1,等于0*/
class Solution {public int digitOneInNumber(int num) {if(num<=0)return 0;long  base = 1;long  res = 0;while(base<=num){long b = num % base;long a = num / base;long cur = a%10;a/=10;if(cur>1)res +=(a+1)*base;else if(cur==1) res +=(a*base+b+1);else res += a*base;base*=10;}return (int)res;}
}

🟡6. LCR 163. 找到第 k 位数字——数字序列中某一位的数字

题目跳转:https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/description/

/* 数字范围    数量  位数    占多少位1-9        9      1       9*1=910-99      90     2       90*2=180100-999    900    3       900*3=27001000-9999  9000   4       9000*4=36000  ...例如 2901 = 9 + 180 + 2700 + 12 即一定是4位数,第12位   n = 12;数据为 = 1000 + (12 - 1)/ 4  = 1000 + 2 = 1002定位1002中的位置 = (n - 1) %  4 = 3    s.charAt(3) = 2;
*/
class Solution {public int findKthNumber(int n) {if(n<=9)return n;long bit = 1;int i = 1;long count = 9;while(count < n){n = (int)(n - count);bit = bit * 10;i++;count = bit * i * 9;}// 确定是在这个区间的哪个数long num = bit + (n - 1) / i;// 确定在 Num 的那个字符int index = (n - 1) % i + 1;int res = (int)(num / Math.pow(10, i - index)) % 10;return res;}
}

🟡7. LCR 164. 破解闯关密码——把数组排成最小的数

题目跳转:https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/description/

class Solution {public String crackPassword(int[] password) {String[] passwordstring = new String[password.length];for(int i = 0;i < password.length;i++){//passwordstring[i] = password[i]+"";passwordstring[i] = String.valueOf(password[i]);}StringBuilder stringbuilder = new StringBuilder();Arrays.sort(passwordstring,(a,b)-> ((a+b).compareTo(b+a)));for(int i = 0;i < passwordstring.length;i++){stringbuilder.append(passwordstring[i]);}return stringbuilder.toString();}
}

学习快排
在这里插入图片描述

class Solution {public String crackPassword(int[] password) {String[] passwordstring = new String[password.length];for(int i = 0;i < password.length;i++){//passwordstring[i] = password[i]+"";passwordstring[i] = String.valueOf(password[i]);}quickSort(passwordstring,0,passwordstring.length-1);StringBuilder stringbuilder = new StringBuilder();for(int i = 0;i < passwordstring.length;i++){stringbuilder.append(passwordstring[i]);}return stringbuilder.toString();}public void quickSort(String[] arr,int left ,int right){if(left>right){return;}int i = partition(arr, left, right);quickSort(arr, left, i - 1);quickSort(arr, i + 1, right);}int partition(String[] arr, int left, int right){String pivot = arr[left]; // 中间值int i = left;int j = right;while (i < j) {while (i <= j && (arr[i] + pivot).compareTo(pivot +arr[i]) <= 0) {i++;}while (i <= j && (arr[j] + pivot).compareTo(pivot +arr[j]) >= 0) {j--;}if(i >= j){break;}String temp = arr[i];arr[i] = arr[j];arr[j] = temp;}arr[left] = arr[j];arr[j] = pivot;return j;}   
}

🟡8. LCR 165. 解密数字——把数字翻译成字符串

题目跳转:https://leetcode.cn/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/description/

class Solution {public int crackNumber(int ciphertext) {String string = ciphertext+"";int temp = string.length();int [] dp = new int[temp+1];dp[0] = 1;dp[1] = 1;for(int i = 2;i<=temp;i++){if(string.charAt(temp-i)>'2'||string.charAt(temp-i)=='0'){dp[i] = dp[i-1];}else if (string.charAt(temp-i)=='2'){if(string.charAt(temp-i+1)<='5'){dp[i]=dp[i-1]+dp[i-2];}else{dp[i] = dp[i-1];}}else{dp[i]=dp[i-1]+dp[i-2];}}return dp[temp];}
}

🟡9. LCR 166. 珠宝的最高价值——礼物的最大价值

题目跳转:https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/

class Solution {public int jewelleryValue(int[][] frame) {if(frame.length==0||frame[0].length==0)return 0;// 动态规划int [][] dp = new int[frame.length][frame[0].length];for(int i = 0;i<frame.length;i++){for(int j = 0;j<frame[i].length;j++){if(i==0&&j==0){dp[i][j] = frame[i][j];}else if(i!=0&&j==0){dp[i][j] = frame[i][j]+dp[i-1][j];}else if(j!=0&&i==0){dp[i][j] = frame[i][j]+dp[i][j-1];}else{dp[i][j] = frame[i][j]+Math.max(dp[i-1][j],dp[i][j-1]);}}}return dp[frame.length-1][frame[0].length-1];}
}

🟡10. LCR 167. 招式拆解 I——最长不含重复字符的子字符串

题目跳转:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/description/

自己写的
在这里插入图片描述

class Solution {public int dismantlingAction(String arr) {if(arr.length()==0||arr.length()==1)return arr.length();char [] chararr = arr.toCharArray();int left = 0;int right = 0;HashMap<Character,Integer> hashMap = new HashMap<>();int [] result = new int[chararr.length];int max = 1;for(int i = 0;i<chararr.length;i++){if(i == 0) {result[0] = 1;hashMap.put(chararr[0],1);continue;}int temp = result[i-1]+1;if(hashMap.containsKey(chararr[i])&&hashMap.get(chararr[i])!=0){while(hashMap.containsKey(chararr[i])&&hashMap.get(chararr[i])!=0){hashMap.put(chararr[left],hashMap.get(chararr[left])-1);temp--;left++;if(left==right)break;}result[i]= temp;}else if(!hashMap.containsKey(chararr[i])||(hashMap.containsKey(chararr[i])&&hashMap.get(chararr[i])==0)){temp = result[i-1]+1;result[i]= temp;}max = Math.max(max,result[i]);hashMap.put(chararr[i],1);}return max;}
}

优化版本

class Solution {// 优化版本public int lengthOfLongestSubstring(String s) {if(s == null || s.length() <= 0){return 0;}// 优化 => 单个变量Map<Character,Integer> map = new HashMap<>();//int[] dp = new int[s.length()];int a = 1;map.put(s.charAt(0), 0);int res = 1;for(int i = 1; i < s.length(); i++){if(!map.containsKey(s.charAt(i))){a = a + 1;// 就是没有刷新 a 之前,a表示dp[i-1]}else{int k = map.get(s.charAt(i));a = i - k <= a ? i - k : a + 1;}res = Math.max(res, a);map.put(s.charAt(i), i);}return res;// 时间On,空间On}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL数据库基础语法-增删改

SQL数据库基础语法-增删改 数据库是 ​ “按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 GeekSec专注技能竞赛培训5年&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;…

synchronized原理Callable接口

synchronized原理 特点 1.synchronized既是一个悲观锁,又是个乐观锁&#xff0c;自适应的&#xff01; synchronized默认是乐观锁,但是如果发现锁竞争比较激烈,就会变成悲观锁!!2.synchronized既是轻量级锁,又是一个重量级锁,自适应&#xff01; synchronized默认是轻量…

字符串算法(算法竞赛)--最小表示法与最详细的字符串哈希

1、B站视频链接&#xff1a;F01 最小表示法_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】最小表示法 - 洛谷 #include <bits/stdc.h> using namespace std; const int N7e5; int n; int s[N];int get_min(){for(int i1;i<n;i)s[ni]s[i];//字符串复制一倍int i1,j…

车载软件架构Adaptive AUTOSAR —— 身份和访问管理和加密技术

车载软件架构Adaptive AUTOSAR —— 身份和访问管理和加密技术 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。…

辽宁博学优晨教育科技有限公司视频剪辑培训靠谱吗?

在数字媒体日益繁荣的今天&#xff0c;视频剪辑已成为一项炙手可热的技能。不少培训机构纷纷涉足这一领域&#xff0c;辽宁博学优晨教育科技有限公司便是其中之一。然而&#xff0c;面对众多的选择&#xff0c;很多人不禁要问&#xff1a;辽宁博学优晨教育科技有限公司的视频剪…

【深度学习每日小知识】交并集 (IoU)

交并集 (IOU) 是一种性能指标&#xff0c;用于评估注释、分割和对象检测算法的准确性。它量化数据集中的预测边界框或分段区域与地面实况边界框或注释区域之间的重叠。 IOU 提供了预测对象与实际对象注释的对齐程度的衡量标准&#xff0c;从而可以评估模型准确性并微调算法以改…

中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

人形机器人专题:传感器,人形机器人实现“具身感知”的关键

今天分享的是人形机器人系列深度研究报告&#xff1a;《人形机器人专题&#xff1a;传感器&#xff0c;人形机器人实现“具身感知”的关键》。 &#xff08;报告出品方&#xff1a;浙商证券股份有限公司&#xff09; 报告共计&#xff1a;44页 来源&#xff1a;人工智能学派…

Redis篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、Redis 集群如何选择数据库?二、怎么测试 Redis 的连通性?三、怎么理解 Redis 事务?四、Redis 事务相关的命令有哪几个?五、Redis key 的过期时间和永久有效分别怎么设置?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易…

备考2025年AMC8数学竞赛:2000-2024年AMC8真题练一练

对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;熟悉AMC8的历年考试真题&#xff0c;既可以了解考试的内容、形式、难度&#xff0c;还可以看看自己的掌握程度&#xff0c;发现自己的短板查漏补缺&#xff0c;毕竟&#xff0c;这个比赛考察的知识点相对固定&#xff0…

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下&#xff08;该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的&#xff0c;所以要替换成yolo模型的librknnrt.so&#xff09;&#xff0c;如下图所示&am…

【Python爬虫】requests库get和post方法使用

requests库是一个常用于http请求的模块&#xff0c;性质是和urllib&#xff0c;urllib2是一样的&#xff0c;作用就是向指定目标网站的后台服务器发起请求&#xff0c;并接收服务器返回的响应内容。 1. 安装requests库 使用pip install requests安装 如果再使用pip安装python…

kali linux出现添加源无法更新的问题:更新时显示签名无效和没有数字签名

kali linux更新源时显示签名无效和没有数字签名 一、出现显示签名无效和没有数字签名二、 解决办法三、几种开源镜像站 一、出现显示签名无效和没有数字签名 原因&#xff1a;因为没有下载签名&#xff0c;所以显示签名无效和没有数字签名 二、 解决办法 wget archive.kali.o…

OpenCV边缘检测与视频读写

原理 OpenCV中的边缘检测原理主要基于图像梯度的计算&#xff0c;包括一阶梯度和二阶梯度。 一阶梯度&#xff1a;它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效&…

命令行窗口文本复制到 Word 格式保持不变

命令行窗口文本复制到 Word 格式保持不变 References 标题栏右键 -> 编辑 -> 标记 / 全选 标题栏右键 -> 编辑 -> 复制 粘贴到 Notepad 中&#xff0c;语言栏设置对应语言&#xff0c;格式可以保持不变 复制文本粘贴到 Excel 中 选中 Excel 中文本复制&#xf…

基于qt的图书管理系统----01数据库设计

参考b站&#xff1a;视频连接 目录 1、数据库设计2、数据库增删改查2.1 book表操作2.2 user表操作2.3 record表的操作&#xff08;重点&#xff09; 3、数据表导出 1、数据库设计 使用sqlite3&#xff0c;新建一个book的表&#xff0c;并且都让主键自增 NmaeValuebookid书本…

GIN框架介绍以及使用

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter&#xff0c;速度提高了近40倍。 如果你是性能和高效的追求者, 你会爱上Gin&#xff0c;而且现在大多数企业都在使用Gin框架&#xff0c;反正学一学总没有错。 1、 GIn框…

赞:java使用easy-excel导入数据的通用模板思路

我们在项目中都会有导入导出的功能&#xff0c;这篇文章主要是讲导出的&#xff0c;导入我会在另外一篇博客文章中讲解。 现在我们开始。 首先&#xff1a;需要在项目中的pom.xml中导入easy-excel的依赖 <!--使用esay-excel进行导入导出 --> <dependency> &…

实习日志26 捷通打印机交接

概要 捷通打印机的研究和使用需要下载一些软件 打印机驱动下载说明 驱动&#xff1a;选择DL-721Z 端口选择&#xff1a;USB002 智能助手&#xff1a;&#xff08;连接&#xff0c;设置打印机&#xff09; 打印机显示 rfid未校准 时可以在这里点RFID标签校验 LabelEditor编译…

unity学习(31)——跳转到角色选择界面(打勾?手滑挂错脚本)

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 是因为后来创建了一个camera&#xff0c;因为camera中自带一个组件Audio Listener。所以有两个camera就有两个audio listener导致报错。 一个简单的解决…