1.关于为什么要写文章来记录学习
学习了很久的数据结构和算法,总发现知识是分散的,而且特别容易忘记一些知识点,所以写一些文章来记录学习笔记和学习心得,未来好复习和使用。
数据结构和算法的学习,主要是跟着B站上的一些老师进行学习,这里先整理跟着尚硅谷的学习笔记。
2.为什么要学习数据结构和算法
- 算法是程序的灵魂,这是不言而喻的,算法可以大幅度地提高程序运行的速度。
- 未来实际工作需要学习算法,很多一线IT公司(俗称大厂)的面试题都会有数据结构和算法的面试题。
- 参加算法竞赛的需要。
3.正式开始学习
-
稀疏数组
最通俗的话来说就是压缩数组,保存有用的数据,缩小程序规模。
下面是稀疏数组的转换方式:
思路:
- 先遍历之前的二维数组,得到有多少的有效值,并记录下来sum
- 根据前数组的行、列、有效值个数创建新的二维数组 newArr int[sum+1][3]
- 将有效数据存入稀疏数组中
代码:
package Algorithm;
public class SparseArray {
public static void main(String[] args) {
//创建原始的二维数组
int Arr[][] = new int[11][11];
Arr[1][2] = 1;
Arr[2][3] = 2;
Arr[4][5] = 2;
//打印二维数组
for(int[]row : Arr){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//记录有效值的个数
int sum = 0;
for(int i = 0;i < 11;i++){
for(int j = 0;j < 11;j++){
if(Arr[i][j] != 0){
sum++;
}
}
}
//创建稀疏数组
int sparseArr[][] = new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
int count = 0;
for(int i = 0;i < 11;i++){
for(int j = 0;j < 11;j++){
if(Arr[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = Arr[i][j];
}
}
}
//输出
for(int i = 0;i < sparseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
}
}
此外还有稀疏数组的恢复。
代码:
//恢复二维数组
int newArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1;i < sparseArr.length;i++) {
newArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//输出恢复的二维数组
for(int[]row:newArr){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}