万物的算法日记|第四天

news2025/1/1 21:43:29

笔者自述:

一直有一个声音也一直能听到身边的大佬经常说,要把算法学习搞好,一定要重视平时的算法学习,虽然每天也在学算法,但是感觉自己一直在假装努力表面功夫骗了自己,没有规划好自己的算法学习和总结,因为后半年也该找实习了,所以每日的算法题要进行恶补,勤能补拙,因此有了这一个算法日记系列;

必读: 大佬你好,感谢您的阅读,这篇文章是我的算法笔记,方便我每日回顾;
为了不耽误您的时间,我把本篇日记的考点方向和算法知识总结列出来,如果对您有需要就继续向下进行阅读

也希望对您有帮助,和您一起通关算法!致谢

请添加图片描述

算法语言:java
题目来源:力扣–书本–初级算法,可以在力扣中搜索相关题名找到更多解法和大神方法
本文知识点:

  1. Hashset和Hashmap讲解

HashSet讲解: 不允许有重复元素,内部无序,由散列表实现,支持快速的查询,插入和删除。
适用场景:需要去除重复元素,不需要有序遍历元素,对元素的增删改查时间复杂度要求是O(1)情况
方法: set.add() set.delete() set.contains() set.size()
缺点:因为无序,所有空间利用率较低,最坏情况,所有元素映射到同一个散列桶内,时间复杂度退化为O(n)

HashMap讲解:键值对形式,允许空建和空值,根据键值快速查找,最优情况增删改查为O(1)
适用场景:根据键值快速增删改查,需要快速遍历映射表中的所有元素,时间复杂度最优为O(1)
方法:map.put(key,value) map.remove(key) map.containsKey(key) map.size() 遍历映射:遍历map中的key结合或者entry集合
缺点:在最坏情况下(所有键值都映射到同一个散列桶中),HashMap的时间复杂度将退化至O(N)。HashMap的性能取决于散列函数的质量。散列函数越好,冲突的概率就越低,HashMap的性能就越好

  1. 对于区间求数范围,可以使用二分法来确定区间的左右边界,因为二分法每次只能确定一个边界,所有可以使用两次二分法来确定左右边界
  2. 二叉搜索树: 左分支小于根节点,有分支大于根节点

    文章目录

    • 剑指 Offer 03. 数组中重复的数字
    • 剑指 Offer 53 - I. 在排序数组中查找数字 I
    • 剑指 Offer 53 - II. 0~n-1 中缺失的数字
    • 剑指 Offer 04. 二维数组中的查找

剑指 Offer 03. 数组中重复的数字

在这里插入图片描述
代码:

class Solution {
    public int findRepeatNumber1(int[] nums){
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i:nums){
            if(map.containsKey(i)){
                return i;
            }else{
                map.put(i,1);
            }
        }
        return -1;
    }
    // 使用hashset 遇到相同的直接返回
    public int findRepeatNumber2(int[] nums){
        Set<Integer> dic = new HashSet<>();
        for(int num: nums){
            if(dic.contains(num)) return num;
            dic.add(num);
        }
        return -1;
    }
     //交换值,相当于hashmap的作用 充分使用题中的条件
    public  int findRepeatNumber(int[] nums){
        int i =0;
        while(i<nums.length){
            if(nums[i] == i){
                i++;
                continue;
            }
            if(nums[nums[i]] == nums[i]) return nums[i];
            int tmp = nums[i];
            nums[i] = nums[tmp];
            nums[tmp] = tmp;
        }
        return -1;
    }
}

学到的知识:

  1. Hashset和Hashmap讲解

HashSet讲解: 不允许有重复元素,内部无序,由散列表实现,支持快速的查询,插入和删除。
适用场景:需要去除重复元素,不需要有序遍历元素,对元素的增删改查时间复杂度要求是O(1)情况
方法: set.add() set.delete() set.contains() set.size()
缺点:因为无序,所有空间利用率较低,最坏情况,所有元素映射到同一个散列桶内,时间复杂度退化为O(n)

HashMap讲解:键值对形式,允许空建和空值,根据键值快速查找,最优情况增删改查为O(1)
适用场景:根据键值快速增删改查,需要快速遍历映射表中的所有元素,时间复杂度最优为O(1)
方法:map.put(key,value) map.remove(key) map.containsKey(key) map.size() 遍历映射:遍历map中的key结合或者entry集合
缺点:在最坏情况下(所有键值都映射到同一个散列桶中),HashMap的时间复杂度将退化至O(N)。HashMap的性能取决于散列函数的质量。散列函数越好,冲突的概率就越低,HashMap的性能就越好

剑指 Offer 53 - I. 在排序数组中查找数字 I

在这里插入图片描述
代码:

class Solution {
//使用二分法来进行查找目标值 因为二分法一次智能找到一个值
//如果要求范围的话 使用两次二分法来找到左右边界
  public int search1(int[] nums, int target) {
    if (nums.length <= 0) {
        return 0;
    }
    int left = 0, right = nums.length - 1;
    // 寻找左边界
    while (left <= right) {
        int mid = left + ((right - left) >> 1);
        if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    if (left >= nums.length || nums[left] != target) {
        // 如果找到的位置越界或者不是目标元素,则不存在目标元素
        return 0;
    }
    int left1 = left;
    left = 0;
    right = nums.length - 1;
    // 寻找右边界
    while (left <= right) {
        int mid = left + ((right - left) >> 1);
        if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    int right1 = right;
    return right1 - left1 + 1;
	}
 //方法二:使用hashmap来进行次数统计
    public int search(int[] nums,int target){
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num))
                map.put(num, map.get(num)+1);
            else
                map.put(num, 1);
        }
        for(int i=0;i<map.size();i++){
            if(map.containsKey(target)){
                return map.get(target);
            }
        }
        return 0;
    }
}

学到的知识:

  1. 使用hashmap操作利用键值对的对应关系来存储次数,根据条件输出,很好的练手题
  2. 因为是排好序的,要求个数,可以求一个区间,使用二分查找找符合规定的数,因为二分查找一次只能找到一个数,所以使用两次二分来分别找到对应的左右边界,通过索引差就可以得到想要的数据。

剑指 Offer 53 - II. 0~n-1 中缺失的数字

在这里插入图片描述
代码:

class Solution {
     public int missingNumber1(int[] nums){
        //求和
        int sum = 0;
        int sum1 =0;
        for(int i =0;i<nums.length;i++){
            sum += nums[i];
        }
        for(int i =1;i<=nums.length;i++){
            sum1 +=i;
        }
        return sum1-sum;
    }

      //使用hashmap解决
    public int missingNumber2(int[] nums){
        HashMap<Integer,Integer> map = new HashMap<>();
        int length = nums.length;
        for(int i =0;i<nums.length;i++){
            map.put(nums[i],1);
        }
        for(int i =0;i<=nums.length;i++){
            if(!map.containsKey(i))
                return i;
        }
        return 0;
    }
    public int missingNumber(int[] nums){
        if(nums.length<=0){
            return 0;
        }
        int xor = 0;
        for(int i =0;i<nums.length;i++){
            xor = xor^nums[i]^(i+1);
        }
        return xor;
    }

}

学到的知识:

  1. 位运算真的很快,学会利用位运算很大程度上降低时间复杂度,上述我实现了三个方法,其中哈希表的时间复杂度最高,但是最容易理解,这道题我做了第二次了,拿到后思路仍然很凌乱,首先想到的是使用哈希表来解决问题,位运算挺好的,要多练习。

剑指 Offer 04. 二维数组中的查找

在这里插入图片描述

代码:

 public boolean findNumberIn2DArray(int[][] matrix,int target){
        //使用双层for循环 可以求出 时间复杂度太高
        // 如何搜索 通过比对 范围 时间复杂度为O(N*M)
        boolean flag ;
        for(int i =0;i<matrix.length;i++){
            for(int j =0;j<matrix[0].length;j++){
                if(target == matrix[i][j]){
                    return true;
                }
            }
        }
        return false;
    }

    //使用二叉树的方法来进行实现
    public boolean findNumberIn2DArray1(int[][] matrix,int target){
        int i = matrix.length-1,j =0;
        while(i>=0&& j<matrix[0].length){
            if (matrix[i][j] >target){
                i--;
            }else if(matrix[i][j] <target){
                j++;
            }else{
                return true;
            }
        }
        return false;
    }

学到的知识:

  1. 二叉搜索树: 左分支小于根节点,有分支大于根节点
    可以通过二叉搜索的方式来找到目标值,通过移动i和j;同时也可以直接使用暴力方法来进行寻找。

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

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

相关文章

IF: 25+ 单细胞转录组学揭示肝实质和非实质细胞系的早期出现

&#xff0c; 桓峰基因公众号推出单细胞生信分析教程并配有视频在线教程&#xff0c;目前整理出来的相关教程目录如下&#xff1a; Topic 6. 克隆进化之 Canopy Topic 7. 克隆进化之 Cardelino Topic 8. 克隆进化之 RobustClone SCS【1】今天开启单细胞之旅&#xff0c;述说单细…

dubbo 服务拆分和调用

序言&#xff1a;dubbo 是阿里巴巴开发的一款开源的java rpc 框架&#xff0c;也就是远程调用框架。本文将说明dubbo服务拆分的实现思路。 本文是基于黑马探花交友前置课程dubbo做出的笔记记录。 完整视频和资料 通过百度网盘分享的文件&#xff1a;黑马 链接:https://pan.bai…

win10家庭版找不到组策略gpedit.msc的解决方法

废话不多说&#xff0c; 直接上方法&#xff1b;注意的事项我会再后面讲到。 1、打开记事本 在记事本中保存如下批处理内容 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mu…

损坏的二进制文件会导致“程序太大而无法放入内存”

不知道你是否做过这样的小实验&#xff1a;将一个可执行文件的头部写入一些无效的数据&#xff0c;或者将一个根本不是可执行文件的大型文件的扩展名改为”.exe”&#xff0c;然后执行它(警告&#xff0c;请记得先保存好工作文件)。 文件不会如预期般那样执行&#xff0c;你会…

【Python 随练】不相同的三位数字

题目&#xff1a; 有 1、2、3、4 个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;在控制台输出出来。 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用Python代码解决一个数学问题&#xff1a;如何使用数字1、2、3和4组合成互不相同且无重复…

Vue 常用指令

指令介绍 指令 : 带有 v- 前缀的特殊属性。 指令的作用 : 当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式地作用于 DOM 。 在整个vue的编写过程当中&#xff0c;只要带v-的&#xff0c;那么都是常用的vue的指令。 v-text v-text作用与双大花括号作用…

【已解决】“X-Content-Type-Options”头缺失或不安全

Appscan是一款安全漏洞扫描软件&#xff0c;由IBM公司研发&#xff0c;后又被卖给了印度公司HCL。 在web安全测试中&#xff0c;今天我们说下扫描结果中包含X-Content-Type-Options请求头header的缺失或不安全的时候&#xff0c;我们该如何应对。 风险&#xff1a;可能会收集…

华为OD机试真题 JavaScript 实现【猴子爬山】【2023 B卷 100分】,附详细解题思路

一、题目描述 一天一只顽猴想去从山脚爬到山顶&#xff0c;途中经过一个有个N个台阶的阶梯&#xff0c;但是这猴子有一个习惯&#xff1a; 每一次只能跳1步或跳3步&#xff0c;试问猴子通过这个阶梯有多少种不同的跳跃方式&#xff1f; 二、输入描述 输入只有一个整数N&…

使用Linux系统命令对后门端口进行查杀

第一步&#xff0c;打开网络拓扑&#xff0c;启动实验虚拟机&#xff0c;查看虚拟机IP地址&#xff1a; Centos Linux 第二步&#xff0c;进入靶机服务器CentOS Linux&#xff0c;调用实验环境。使用docker images命令查看靶机服务器上的Docker镜像环境&#xff0c;找到本次实…

《水经注地图服务》横向扩展部署说明

在地图服务器中&#xff0c;随着数据量的不断增大&#xff0c;可能会存在原有的存储设备空间不够的情况&#xff0c;或无法承受高并发请求的情况。 此时&#xff0c;我们就可以通过横向扩展部署&#xff0c;增加新的设备来进行分担缓减&#xff0c;从而达到动态扩展存储设备以…

华为流程体系:IPD流程框架(限制版)

目录 前言 详细内容 专栏列表 CSDN学院课程地址 前言 今天主要来谈谈 IPD 体系的主体框架所涉及的一些相关内容。 其实关于 IPD 体系&#xff0c;我在之前的文章或课程中都有过不同程度的讲解。 但是&#xff0c;由于这个体系所涉及的面是非常广泛的。 这个时候就必须通…

加固你的数据防线:避免成为SQL注入攻击的下一个目标

SQL注入是一种常见的Web应用程序安全漏洞&#xff0c;攻击者利用该漏洞通过构造恶意的SQL查询语句&#xff0c;以执行未经授权的操作或获取敏感数据。本文将介绍SQL注入的概念、攻击原理以及常见的防范方案&#xff0c;帮助开发人员和系统管理员加强对Web应用程序的安全性。 1、…

深入理解迭代器,笛卡尔积,from itertools import product 小白一看就会

文章目录 一、product()是什么&#xff1f;二、product()的具体使用案例代码详细分析 总结 一、product()是什么&#xff1f; 在Python中&#xff0c;product()是内置函数itertools提供的一个工具函数&#xff0c;可以计算多个可迭代对象的笛卡尔积。product()接受一个或多个可…

7、微服务组件gateway

1、引入gateway 在原来的项目中添加gateway模块 gateway是springcloud中的组件&#xff0c;所以要确保父项目的pom.xml中引入了springcloud 那么在gateway模块的pom.xml中引入gateway&#xff0c;如下&#xff1a; <?xml version"1.0" encoding"UTF-8&quo…

Jmeter集成到jenkins

Jmeter集成到Jenkins 序号 修改人 版本 创建日期 修改日期 备注 1 进击的雷神 V1.0 Jmeter集成到Jenkins. 1 软件下载... 4 一:环境配置... 4 1.JDK安装&#xff…

ADC动态指标

量化误差ADC输出-ADC模拟输入 量化噪声功率&#xff1a; 信噪比&#xff1a; 由于仅仅考虑了量化噪声&#xff0c;上式为ADC的SNDR所能达到的极限值 N8,SNDR_max50dB N12,SNDR_max74dB N16,SNDR_max98dB N20,SNDR_max122dB 实际ADC还需要考虑期间噪声和电路非理想特性&am…

Python10行以内代码能有什么高端操作

Python10行以内代码能有什么高端操作 Python凭借其简洁的代码&#xff0c;赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块&#xff0c;从而形成良性循环&#xff0c;Python可以凭借更加简短的代码实现许多有趣的操作。下面我们来看看&#xff0c;我们…

关于组织申报国家重点研发计划“高性能制造技术与重大装备”等重点专项2023年度项目的通知

源自&#xff1a;上海市科学技术委员会 各有关单位&#xff1a; 根据《科技部关于发布国家重点研发计划“高性能制造技术与重大装备”等6个重点专项2023年度项目申报指南的通知》&#xff08;国科发资〔2023〕90号&#xff09;《科技部关于发布国家重点研发计划“文化科技与现…

Linux---端口(nmap、netstat)、进程管理(ps、kill)

1. 端口 端口&#xff0c;是设备与外界通讯交流的出入口。端口可以分为&#xff1a;物理端口和虚拟端口两类。 物理端口&#xff1a;又可称之为接口&#xff0c;是可见的端口&#xff0c;如USB接口&#xff0c;RJ45网口&#xff0c;HDMI端口等。 虚拟端口&#xff1a;是指计…

制定测试计划和测试用例

制定测试计划和测试用例 测试是软件开发过程中很重要的一环&#xff0c;通过测试可以发现和修复软件中的缺陷或错误&#xff0c;保证软件的质量和可靠性。在进行软件测试时&#xff0c;制定合理的测试计划和测试用例是非常必要的&#xff0c;下面我将从这两个方面分别进行讲解。…