Math 题目总结

2024-09-04 13:38
文章标签 总结 题目 math

本文主要是介绍Math 题目总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Math的题目,其实全是数学知识,没有什么太多的算法可言。

Sparse Matrix Multiplication (矩阵相乘就是所有的k,A(i,k) * B(k,j) = C(i,j) ,稀疏矩阵就是 有很多0,为了提高速度也就是如果 A(i,k) 或者B(k,j), k 从0到length,如果有0,那么这个计算就不进行了)

class Solution {public int[][] multiply(int[][] mat1, int[][] mat2) {// m * k , k * n = m * n;int m = mat1.length;int n = mat2[0].length;int[][] res = new int[m][n];for(int i = 0; i < m; i++) {for(int k = 0; k < mat1[0].length; k++) {if(mat1[i][k] != 0) {for(int j = 0; j < n; j++) {if(mat2[k][j] != 0) {// // m * k , k * n = m * n; // k是一个list,所以res是个加和的关系;res[i][j] += mat1[i][k] * mat2[k][j];}}}}}return res;}
}

Spiral Matrix , 思路:用startX, endX, startY, endY来做决定,这个算法是最容易懂的;

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new ArrayList<>();int m = matrix.length;int n = matrix[0].length;int startX = 0; int endX = m - 1;int startY = 0; int endY = n - 1;while(startX <= endX && startY <= endY) {// collect top;for(int j = startY; j <= endY; j++) {list.add(matrix[startX][j]);}if(++startX > endX) break;// collect right;for(int i = startX; i <= endX; i++) {list.add(matrix[i][endY]);}if(--endY < startY) break;// collect bottom;for(int j = endY; j >= startY; j--) {list.add(matrix[endX][j]);}if(--endX < startX) break;// collect left;for(int i = endX; i >= startX; i--) {list.add(matrix[i][startY]);}if(++startY > endY) break;}return list;}
}

Spiral Matrix II 算法跟之前的 Sprial Matrix I,一模一样。

class Solution {public int[][] generateMatrix(int n) {int startX = 0; int endX = n - 1;int startY = 0; int endY = n - 1;int[][] res = new int[n][n];int value = 1;while(startX <= endX && startY <= endY) {// top;for(int j = startY; j <= endY; j++) {res[startX][j] = value++;}if(++startX > endX) break;// right;for(int i = startX; i <= endX; i++) {res[i][endY] = value++;}if(--endY < startY) break;// bottom;for(int j = endY; j >= startY; j--) {res[endX][j] = value++;}if(--endX < startX) break;// left;for(int i = endX; i >= startX; i--) {res[i][startY] = value++;}if(++startY > endY) break;}return res;}
}

Set Matrix Zero 思路:终极follow up是是否用O(1)space来做,思路就是,利用第一行和第一列还记录为0的信息,然后用两个变量hold住第一行和第一列是否需要变为0。然后扫描中间的matrix,如果对应行或者列,在第一行和第一列上是0,那么设置成0,然后再判断第一行和第一列是否需要清空;

class Solution {public void setZeroes(int[][] matrix) {if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {return;}boolean firstrow = false;boolean firstcol = false;int m = matrix.length;int n = matrix[0].length;for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(matrix[i][j] == 0) {if(i == 0) {firstrow = true;}if(j == 0) {firstcol = true;}matrix[0][j] = 0;matrix[i][0] = 0;}}}for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {// 如果横竖,有0元素,这个[i,j] 就为0;if(matrix[0][j] == 0 || matrix[i][0] == 0) {matrix[i][j] = 0;}}}if(firstrow) {for(int j = 0; j < n; j++) {matrix[0][j] = 0;}}if(firstcol) {for(int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
}

Second Max of Array 思路:打擂台算法;比最大的大,顺序挪动,比第二的大,就赋值第二大的;刚开始取最小的Integer.MIN_VALUE;

public class Solution {/*** @param nums: An integer array* @return: The second max number in the array.*/public int secondMax(int[] nums) {if(nums == null || nums.length == 0) {return -1;}int max = Integer.MIN_VALUE; int secondmax = Integer.MIN_VALUE;for(int i = 0; i < nums.length; i++) {if(nums[i] > max) {secondmax = max;max = nums[i];} else if(nums[i] > secondmax) {secondmax = nums[i];}}return secondmax;}
}

Max Consecutive Ones 思路:扫一遍,遇见1就count++; 并且同时update res,遇见0就清零;

class Solution {public int findMaxConsecutiveOnes(int[] nums) {int count = 0;int maxcount = 0;for(int i = 0; i < nums.length; i++) {if(nums[i] == 1) {count++;} else {count = 0;}maxcount = Math.max(maxcount, count);}return maxcount;}
}

Minimum Area Rectangle 核心思想就是双层遍历,假设两个点分别是左上角(x1, y1)和右下角(x2, y2),看能否找到(x2, y1), (x1, y2),怎么找,那么就是同样的x下面有一系列点,那么就是HashMap<Integer, HashSet<Integer>>来找;注意遍历的时候,双层循环是points.length;

class Solution {public int minAreaRect(int[][] points) {if(points == null || points.length == 0 || points[0].length == 0) {return 0;}HashMap<Integer, HashSet<Integer>> hashmap = new HashMap<>();for(int[] point: points) {int x = point[0];int y = point[1];hashmap.putIfAbsent(x, new HashSet<Integer>());hashmap.get(x).add(y);}int res = Integer.MAX_VALUE;for(int i = 0; i < points.length; i++) {for(int j = i + 1; j < points.length; j++) {int x1 = points[i][0];int y1 = points[i][1];int x2 = points[j][0];int y2 = points[j][1];// 注意这里是或者,因为只要在一条直线上,area都是0;if(x1 == x2 || y1 == y2) {continue;}if(hashmap.get(x1).contains(y2) && hashmap.get(x2).contains(y1)) {res = Math.min(res, Math.abs(x2 - x1) * Math.abs(y2 - y1));}}}return res == Integer.MAX_VALUE ? 0 : res;}
}

Candy Crush horizontal 和vertical比较之后,把相同的三个元素的值变成负数,那么每次比较的时候比较绝对值就可以了。改成负数之后,再做vertical的消去,怎么消去就是从低端开始,把不是负数的值挪到低端,最后上面的清零;然后循环,看有没有需要消去match的,如果没有了,就返回最终结果。O((m * n ) * (m * n);

class Solution {public int[][] candyCrush(int[][] board) {int m = board.length;int n = board[0].length;boolean shouldContinue = false;// match horizontal;for(int i = 0; i < m; i++) {for(int j = 0; j < n - 2; j++) {int v = Math.abs(board[i][j]);if(v > 0 && v == Math.abs(board[i][j + 1]) && v == Math.abs(board[i][j + 2])) {shouldContinue = true;board[i][j] = board[i][j + 1] = board[i][j + 2] = -v;}}}// match vertical;for(int i = 0; i < m - 2; i++) {for(int j = 0; j < n; j++) {int v = Math.abs(board[i][j]);if(v > 0 && v == Math.abs(board[i + 1][j]) && v == Math.abs(board[i + 2][j])) {shouldContinue = true;board[i][j] = board[i + 1][j] = board[i + 2][j] = -v;}}}// drop vertical;for(int j = 0; j < n; j++) {int r = m - 1;// drop;for(int k = r; k >= 0; k--) {if(board[k][j] > 0) {board[r--][j] = board[k][j];}}//set 0;for(int k = r; k >= 0; k--) {board[k][j] = 0;}}return shouldContinue ?  candyCrush(board) : board;}
}

Rectangle Area 两个面积之和,等于两个面积减去公共的overlap面积;求公共的面积,等于 右边一维的最小值,减去左边一维的最大值;同理求得 y轴的length;两者相乘就是overlap的面积;

class Solution {public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {int abcd = (C - A) * (D - B);int efgh = (G - E) * (H - F);int overlap = getOverlapLength(A, C, E, G) * getOverlapLength(B, D, F, H);return abcd + efgh - overlap;}private int getOverlapLength(int A, int C, int E, int G) {if(E > C || G < A) {return 0;}return Math.min(C, G) - Math.max(A, E);}
}

Find N Unique Integers Sum up to Zero  前面继续加,最后一个数为-sum;

class Solution {public int[] sumZero(int n) {int[] res = new int[n];int sum = 0;for(int i = 0; i < n - 1; i++) {res[i] = i + 1;sum += i + 1;}res[n - 1] = -sum;return res;}
}

Increasing Triplet Subsequence  找出当前的最小值和第二小的值,如果还有值比第二小的值大,那么就return true;否则return false;

class Solution {public boolean increasingTriplet(int[] nums) {if(nums == null || nums.length == 0 ) {return false;}int min = Integer.MAX_VALUE;int secondMin = Integer.MAX_VALUE;for(int num: nums) {if(num <= min) {min = num;} else if(num <= secondMin) {secondMin = num;} else if(num > secondMin) {return true;}}return false;}
}

Maximum Length of Subarray With Positive Product

这个算法是目前为止最清晰的;

1.If we see a 0, we gotta start off things again
2.If we see a positive number :
     2.1. Increase length of positive mutilpicative result till now.
     2.2. Increase length of negative mutilpicative result till now, unless we had not encountered any negative before.
3. If we see a negative number:
    3.1. It's time to swap positive and negative multiplicative results' lengths and do similar task as we did in above case.
4. In each iteration, use the length of positive mutilpicative result to compute answer.
 

class Solution {public int getMaxLen(int[] nums) {if(nums == null || nums.length == 0) {return 0;}int positive = 0; int negative = 0;int res = 0;for(int num: nums) {if(num == 0) {positive = 0;negative = 0;} else if(num > 0) {positive++;negative = negative == 0 ? 0 : negative+1;} else {// num < 0;int temp = positive;positive = negative == 0 ? 0 : negative + 1;negative = temp + 1;}res = Math.max(res, positive);}return res;}
}

这篇关于Math 题目总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136164

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果