算法学习day16——刷题(仍然是数组)

一、图片平滑器

图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。

每个单元格的  平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。

如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。

思路:

双层for循环对二维数组遍历。如何处理每一个格子?就是将以它为中心周围有效格子的和加起来。周围的格子范围是for(int x=row-1;x<=row+1;x++) for(int y=col-1;y<=col+1;y++);三行三列。如何判断格子是否在有效范围里:遍历周围格子范围的时候加一个if条件判断if(x>=0&&x<row&&y>=0&&y<col)

代码:
class Solution {public int[][] imageSmoother(int[][] img) {int row=img.length;int col=img[0].length;int[][] res=new int[row][col];for(int i=0;i<row;i++){for(int j=0;j<col;j++){//开始遍历int sum=0;//总和int num=0;//number个数for(int x=i-1;x<=i+1;x++){for(int y=j-1;y<=j+1;y++){if(x>=0&&x<row&&y>=0&&y<col){sum+=img[x][y];num++;}}}res[i][j]=sum/num;}}return res;}
}

二、轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
思路:

1.将一个数组轮转,下标为<=size-1-k的部分,就会往后移动。如果下标是>size-1-k的这部分就会翻转到前面去。

2.因此首先将整个数组反转,这样往后移动的和往前移动的效果都达到了。但是局部的顺序是反的。所以还要将局部进行反转

3.一共需要进行三次反转。

代码:
class Solution {public void rotate(int[] nums, int k) {/**1.首先将整个数组翻转过来2.然后将(0,k%nums.length-1)这段数组正序 3.(k%nums.length,nums.length-1)*/int size=nums.length;reverse(nums,0,size-1);reverse(nums,0,k%size-1);reverse(nums,k%size,size-1);}public void reverse(int[] nums,int left,int right){while(left<right){int temp=nums[left];nums[left]=nums[right];nums[right]=temp;left++;right--;}}
}

三、旋转函数(公式推导)

暴力法(超时):每次从nums[i]出发,依次用0 1 2 3乘以接下来的每一个数,然后求和。找一个最大值
代码:
class Solution {public int maxRotateFunction(int[] nums) {int max=Integer.MIN_VALUE;int size=nums.length;for(int i=0;i<size;i++){int sum=0;for(int j=0;j<size;j++){sum+=j*nums[(i+j)%size];}//System.out.println("第"+(i+1)+"次的sum为:"+sum);max=Math.max(max,sum);}return max;}
}
规律法:

F0=0*a0+1*a1+2*a2+3*a3

F1=0*a3+1*a0+2*a1+3*a2

F2=0*a2+1*a3+2*a0+3*a1

...

找规律:F1=F0+a0+a1+a2-3*a3  

                   =F0+sum-4*a3

              F2=F1+a3+a0+a1-3*a2

                  =F1+sum-4*a2

因此F(i)=F(i-1)+sum-(size)*ai;

代码:
class Solution {public int maxRotateFunction(int[] nums) {int size=nums.length;int[] dp=new int[size];int sum=0;for(int i=0;i<size;i++){sum+=nums[i];dp[0]+=i*nums[i];}//根据找出的规律进行计算int max=dp[0];for(int i=1;i<size;i++){dp[i]=dp[i-1]+sum-size*nums[size-i];max=Math.max(max,dp[i]);}return max;}
}

四、螺旋矩阵(容易混乱)

思路:

使用左右上下边界:rowStart,rowEnd,colStart,colEnd;

while条件是rowStart<=rowEnd&&colStart<=colEnd;

分四种情况:

1.从左往右,遍历完之后rowStart++(最上面一行直接扔掉)

2.从上往下,遍历完之后colEnd--(最右边一列直接扔掉)

3.从右往左,遍历完之后rowEnd--(最下面一行直接扔掉)。从右往左的时候要判断(rowStart<=rowEnd)

4.从下往上同理。

代码:

 class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list=new ArrayList<>();int rowEnd=matrix.length-1;int colEnd=matrix[0].length-1;int rowStart=0;int colStart=0;while(rowStart<=rowEnd&&colStart<=colEnd){//从左往右for(int i=colStart;i<=colEnd;i++){list.add(matrix[rowStart][i]);}rowStart++;//第二行了//从上往下for(int i=rowStart;i<=rowEnd;i++){list.add(matrix[i][colEnd]);}colEnd--;//少一列了//上右往左if(rowStart<=rowEnd){for(int i=colEnd;i>=colStart;i--){list.add(matrix[rowEnd][i]);}}rowEnd--;//少一行了//从下往上if(colStart<=colEnd){for(int i=rowEnd;i>=rowStart;i--){list.add(matrix[i][colStart]);}}colStart++;//列往右移动}return list;}
}

五、对角线遍历(我曹....)

六、旋转图像(有技巧)

技巧:先沿着对角线(右上到左下,统一一个方向就行)对称交换,然后按照列对称翻折。
案例:

1.先沿着对角线对称翻折交换 24换 37换 68换

2.然后沿着中间列,两边列对称交换。

17/28/39

代码:
class Solution {public void rotate(int[][] matrix) {/*** 有技巧的:先按照对角线翻折,然后再列翻折*/// 沿对角线翻折int size = matrix.length;for (int i = 0; i < size; i++) {for (int j = 0; j < i; j++) {swap(matrix, i, j, j, i);}}printfArr(matrix);// 然后按照列翻折for (int i = 0; i < size; i++) {for (int j = 0; j < size / 2; j++) {swap(matrix, i, j, i, size - 1 - j);}}printfArr(matrix);}public void swap(int[][] nums, int a, int b, int x, int y) {int temp = nums[a][b];nums[a][b] = nums[x][y];nums[x][y] = temp;}public void printfArr(int[][] nums) {System.out.println("===================================");for (int[] num : nums) {for (int number : num) {System.out.print(number + " ");}System.out.println("");}}
}

七、矩阵置零

思路:

首先遍历一遍数组,将元素值为0的横纵坐标记录下来。使用两个set集合,Set<Integer> zeroRow,

Set<Integer>zeroCol,(Set集合中的元素不能重复也没关系,因为如果碰到两个第0列,都是为了将第0列的元素置为0);

代码:
class Solution {public void setZeroes(int[][] matrix) {int row=matrix.length;int col=matrix[0].length;Set<Integer> zeroRows=new HashSet<>();Set<Integer> zeroCols=new HashSet<>();//先把所有为0的点都找出来for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(matrix[i][j]==0){zeroRows.add(i);zeroCols.add(j);}}}//然后对行置零for(int r:zeroRows){for(int j=0;j<col;j++){matrix[r][j]=0;}}//对列置零for(int c:zeroCols){for(int i=0;i<row;i++){matrix[i][c]=0;}}}
}

八、生命游戏(和图片平滑器类似)

题目意思:就是判断每一个格子周围的八个格子中活细胞的个数(以该格子为中心)。然后根据活细胞的个数对该格子的细胞的状态进行判断。

注意的点:活细胞的个数是周围八个格子中的个数,不包含自身。然后不能判断完就修改格子的状态。这样会影响到其他格子的判断。所以应该创建一个nextState[i][j];

思路:

和图片平滑器类似,遍历每一个点,然后又遍历每一个点的周围八个点,如果越界的就不考虑

代码:
class Solution {public void gameOfLife(int[][] board) {int row = board.length;int col = board[0].length;int[][] nextState = new int[row][col];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {// 然后对每一个细胞格子进行判断int live = 0;for (int x = i - 1; x <= i + 1; x++) {for (int y = j - 1; y <= j + 1; y++) {if (x >= 0 && x < row && y >= 0 && y < col) {live += board[x][y];}}}live -= board[i][j];// 要去掉当前细胞的值if (board[i][j] == 1 && (live < 2 || live > 3))nextState[i][j] = 0;else if (board[i][j] == 1 && (live == 2 || live == 3))nextState[i][j] = 1;else if (board[i][j] == 0 && live == 3)nextState[i][j] = 1;else {nextState[i][j] = board[i][j];}}}for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board[i][j] = nextState[i][j];}}}
}

九、除自身以外数组的乘积(不让用除法)

思路:

对角线都是1(因为是除了自己以外,其他的都要相乘)

左下三角里:B[1]和右上三角里:B[1] 乘起来就是除了该元素以外,其他元素的乘积。

因此先求左下三角,再求右上三角,然后累乘就OK。

左下三角:

b[0]=1;从b1开始->b[1]=b[0]*a[0];

b[2]=b[1]*a[1]; 因此找到规律:

for(int i=1;i<size;i++){b[i]=b[i-1]*a[i-1];
}
右上三角:

左下三角是从1开始的,那么右下三角就从size-2开始;int temp=1;

temp*=a[i+1]//每一行都会积累 eg:最后一行是1 倒数第二行是1*5 倒数第三行是1*4*5

b[i]*=temp;//之前左下三角的累积 再乘以右上三角的累积

int temp=1;
for(int i=size-2;i>=0;i--){temp=a[i+1];b[i]*=temp;
}
代码:
class Solution {public int[] productExceptSelf(int[] nums) {int len = nums.length;if (len == 0) return new int[0];int[] ans = new int[len];ans[0] = 1;int tmp = 1;for (int i = 1; i < len; i++) {ans[i] = ans[i - 1] * nums[i - 1];}for (int i = len - 2; i >= 0; i--) {tmp *= nums[i + 1];ans[i] *= tmp;}return ans;}
}

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

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

相关文章

使用llama-cpp-python制作api接口

文章目录 概要整体操作流程技术细节小结 概要 使用llama-cpp-python制作api接口&#xff0c;可以接入gradio当中&#xff0c;参考上一节。 llama-cpp-python的github网址 整体操作流程 下载llama-cpp-python。首先判断自己是在CPU的环境下还是GPU的环境下。以下操作均在魔搭…

应用层——HTTP

像我们电脑和手机使用的应用软件就是在应用层写的&#xff0c;当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能&#xff0c;比如HTTP,FTP… 我们程序员写的一个个解决我们实际的问题都在应用层&#xff0c;我们今天来聊一聊HTTP。 协议 协议…

Java案例遍历集合中的自定义对象

目录 一&#xff1a;案例要求&#xff1a; 二案例分析&#xff1a; ​编辑三&#xff1a;具体代码&#xff1a; 四&#xff1a;运行结果&#xff1a; 一&#xff1a;案例要求&#xff1a; 二案例分析&#xff1a; 三&#xff1a;具体代码&#xff1a; Ⅰ&#xff1a; pack…

pyinstaller用法详解3

本文使用创作助手。 大家好&#xff0c;时隔多日&#xff0c;我又更新了pyinstaller的用法详解&#xff01; 当然&#xff0c;这一次要比之前更详细&#xff0c;十分详细。 谢谢大家的支持&#xff0c;我们现在开始&#xff01; 一、快速开始使用pyinstaller 我之前的文章…

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及&#xff0c;Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一&#xff0c;不仅在金融和供应链管理等领域展示了其巨大的潜力&#xff0c;也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…

Java 中的迭代器

Iterator (迭代器) 正是由于每一个容器都有取出元素的功能&#xff0c;这些功能定义都一样&#xff0c;所以对共性的取出功能进行了抽取&#xff0c;从而出现了Iterator接口。由于每一个容器的数据结构不一样&#xff0c;所以具体的实现方式也不同&#xff0c;每一个容器都在其…

[激光原理与应用-115]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 19 - 主要硬件的介绍、安装与调试

目录 一、概述 1.1 前言 1.2 系统组成 1.2.1 机柜版&#xff1a; 1.2.2 非机柜版 1.3适用范围 1.4 工作条件 1.5 安全说明 1.6 装箱清单 二、硬件安装 2.1 光学传感器安装 2.1.1 转接件安装 2.1.2 光路校准模块的安装与光路校准 2.1.3 光学传感器的安装 2.2 通…

Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(已解决)

文章目录 一、下载MySQL的docker镜像二、启动MySQL容器2.1 命令2.2 报错mysqld: Cant read dir of /etc/mysql/conf.d/ (Errcode: 2 - No such file or directory) 三、进入mysql容器四、修改mysql默认配置4.1 查看mysql挂载的文件夹4.2 mysql配置 五、补充 如果还没在虚拟机/服…

新版本cesium编译1.103之后的版本

cesium1.1之后的版本文件结构域1.1之前的版本有了很大的差别&#xff0c;源码也全部移到了packages目录中。有很多依赖包没有写在根目录的package.json文件中。npm i 后直接编译会保持。 cesium源码git https://github.com/CesiumGS/cesium 1、添加缺少的包&#xff0c;缺少的…

《昇思25天学习打卡营第25天|onereal》

初学入门/初学教程/08-模型训练.ipynb 模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 构建数据集 首先从数…

SSD实现

一、模型 此模型主要由基础网络组成&#xff0c;其后是几个多尺度特征块。基本网络用于从输入图像中提取特征&#xff0c;因此它可以使用深度卷积神经网络。 单发多框检测选用了在分类层之前截断的VGG&#xff0c;现在也常用ResNet替代&#xff1b;可以设计基础网络&#xff0c…

synchronized的实现原理和锁升级 面试重点

1.synchronized的实现原理 synchronized是Java 中的一个很重要的关键字&#xff0c;主要用来加锁&#xff0c;synchronized所添加的锁有以下几个特点。synchronized的使用方法比较简单&#xff0c;主要可以用来修饰方法和代码块。根据其锁定的对象不同&#xff0c;可以用来定义…

生命周期的妙用——Vue3

Vue3的生命周期 从Vue2到Vue3&#x1f47e;不只onMounted又见keep-alive主要属性被你包裹应用场景 ) 从Vue2到Vue3&#x1f47e; Vue 3 保留了大多数 Vue 2 的生命周期钩子&#xff0c;同时引入了组合 API 中的生命周期钩子。以下是 Vue 3 中的生命周期钩子&#xff1a; 不…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(下:数据操作与查询)

文章目录 DML数据操作语言1、新增记录2、删除记录3、修改记录 DQL数据查询语言1、查询记录2、条件筛选3、排序4、函数5、分组条件6、嵌套7、模糊查询8、limit分页查询 集合操作union关键字和运算符in关键字any关键字some关键字all关键字 联合查询1、广义笛卡尔积2、等值连接3、…

HTML+JS+CSS计算练习

可填 题目数量 数字范围 计算符号 题目做完后会弹窗提示正确率、用时 效果图 源代码在图片后面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

【深度学习】inpaint图像中的alpha混合图的边缘处理

比如原图是&#xff1a; 红圈内就是文字水印&#xff0c;经过inpaint后得到图和原图混合&#xff0c;如何处理边界呢&#xff0c;这个代码可以干这事&#xff1a; 越是中心就直接用inpaint图&#xff0c;否则就用原图&#xff0c;这样进行alpha混合。 import numpy as np i…

js reduce 的别样用法

let mergedItems list.reduce((accumulator, currentItem) > {let existingItem accumulator.find((item) > item.manObject_name currentItem.manObject_name);if (existingItem) {existingItem.laborCostHand currentItem.laborCostHand; //劳务费existingItem.wor…

windows下使用make编译C/C++程序 gcc编译 MinGW编译器

文章目录 1、概要2、编译环境搭建3、创建工程目录结构4、 编写程序4.1 编写头文件4.2 编写源文件 5、编写makefile及相关文件5.1 编写清理编译生成文件的批处理文件&#xff0c;供makefile调用5.2 编写makefile文件 6、编译工程6.1 打开命令行6.2 使用make命令编译程序6.3 编译…

effective c++学习笔记1

Effective C 来源于阿西拜编程 《Effective C》2023&#xff08;上部完整版&#xff09; C进阶看这个_哔哩哔哩_bilibili 2024年7月15日 第一章 第1条 第7章&#xff0c;学完比较能够看懂&#xff0c;一般公司不推荐写模板&#xff08;调试麻烦&#xff0c;维护成本高&…

Anaconda创建新的环境一直报错

Anaconda创建新的环境一直报错 报错信息如下&#xff1a; CondaHTTPError: HTTP 404 NOT FOUND for url <https://pypi.tuna.tsinghua.edu.cn/simple/noarch/repodata.json> Elapsed: 00:01.358961The remote server could not find the noarch directory for the requ…