datawhale算法与数据结构(上)day1数组

datawhale算法与数据结构(上)day1

task01: 数组

  • 理解数组的存储与分类
  • 实现动态数组,该数组能够根据需要修改数组的长度

数组的存储

数组
不管是一维还是多维数组,都是顺序存储,它们的地址都是相连的,数组采用顺序存储结构

数组的分类

  1. 依据内存资源管理角度,分为静态数组和动态数组
  • 静态数组
    在变异期间在栈中分配好内存的数组
    (1)在运行期间不能改变存储空间,运行后由系统自由释放
    (2)编译器保存福安与数组长度的信息,sizeof()便可以体现
int a[10];
char b[10];
class a[10]; //class为自定义的类,定义一个包含10个class对象的数组

需要注意的时静态数组在编译期间就已经分配好内存,所以一定要指定数组的大小,不能以变量作为数组的大小,以下的行为是不允许的

int i;
char a[i];  //编译期间不能确定i的值,无法明确数组的大小,编译失败
  • 动态数组:
    在程序运行后才分配内存的数组,需要人工手动去创建和释放
//c语言中国利用malloc函数来创建动态数组
int i;
scanf("%d", &i);
char *p = (char *)malloc(sizeof(char)*i);
//分配长度为i的字符数组空间,可以以下标访问数组,不需要时要调用free()函数手动释放

//C++中,利用new关键字创建动态数组
int i;
cin>>i;
char *p = new char[i];
//分配长度为i的字符数组空间,可以以下标访问数组,不需要是要delete p,手动释放
  1. 依据维度来看,分为一维数组和多维数组
  • 一维数组
    一维数组是一种线性数组,访问元素时涉及到一个单独的下标,它可以表示行或列所以i你
    来源知乎
    (1)a[i] = (a+i);
    (2)a是数组的首地址也是第一个元素的地址。
    (3)a+i代表的是第i个元素的地址。
    (4)a+i并不是简简单单第一个元素的地址+i,而应该是第一个元素的地址+i
    sizeof(数组类型)。

  • 多维数组
    多维数组a[i][j],其地址为a + c * i + d* j,a表示数组最开始的地址,c表示每个元素所占字节数,d表示多维数组中第一维元素(行地址的增量)所占字节数

来源csdn
二维数组a[3][2]可以理解维一个特殊的一维数组,这个一维数组中每一个元素都是另一个一维数组,比如a[0][2]实际上是另一个数组,包含两个元素a[0][0]和a[0][1]

(1) a+i 指向a[i][2]:a是数组的首地址,由一维数组的性质”首地址+i“得到的是第i个元素的地址,所以,a+i指向特殊一维数组的第i个元素,它指向一个地址
(2)a[i]指向a[i][0]:a[0]相当于一维数组名,指向首元素a[0][0],所以a[i]指向a[i][0],a[i]+j指向a[i][j].它指向一个元素
a[i]=(a+i),
a[i][j]=
(*(a+i)+j)

动态二维数组的创建:

//c
void main(){
	int row,col;
	scanf("%d,%d",&row,&col); //自定义行数和列数
	int **a = (int**)malloc(sizeof(int *) * row);  //分配指向行的指针数组
	for(int k=0; k<row; k++){
		a[k] = (int *)malloc(sizeof(int) *col); //分配行指针所指向的数组
	}
 
	for(k=0; k<row; k++){ 
		free(a[k]); //释放所有行空间
	}
	free(a); //释放行指针数组
}

//c++
void main(){
	int row,col;
	cin>>row>>col; //自定义行数和列数
	int **a = new int*[row];  //分配指向行的指针数组,因为(*行指针)才能得到每行首元素的地址,所以可以理解为行指针是指向首元素指针的指针
	for(int k=0; k<row; k++){
		a[k] = new int[col]; //分配行指针所指向的数组
	}
 
	for(k=0; k<row; k++){ 
		delete [] a[k]; //释放所有行空间
	}
	delete [] a; //释放行指针数组

题目练习

  1. 利用动态数组解决数据存放问题
    编写一段代码,要求输入一个整数N,用动态数组A来存放2~N之间所有5或7的倍数,输出该数组。
    示例:示例
#include <iostream>
using std::cin; using std::cout;
using std::endl;

int main(){
	int n;
	cout << "N = ";
	cin>>n;
	int *p = new int[1];
	for(int i =2; i < n; i++){
		if(i%5 == 0 or i%7 == 0){
			*p = i;
			cout << *p << " ";
			*p++; 
		}
	}	
	return 0;
} 

2.托普利茨矩阵问题

如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。

给定一个M x N的矩阵,当且仅当它是托普利茨矩阵时返回True。

示例:
示例
在上述矩阵中, 其对角线为: “[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”, “[3, 3]”, “[4]”。 各条对角线上的所有元素均相同, 因此答案是True。

#include <iostream>
//#include "stdafx.h"
using namespace std;


int main(){
	int m,n;
	cout<<"m = ";
	cin>> m;
	cout << "n = ";
	cin>>n;
	
	int **arr = new int*[m];
	for(int i = 0; i<n; i++)
		arr[i]= new int[n];
	int element;
	cout<<"请输入矩阵:"<<endl;
	for(int i =0; i<m; i++){
		for(int j = 0; j<n; j++){
			cin>> arr[i][j];
		}	
	}
	
	bool flag = true;
	
	for(int i = 0; i< m-1; ++i){
		for(int j = 0; j< n-1; ++j){
			if(arr[i][j] != arr[i+1][j+1])
				flag =  false;
		}
	}
	
	cout<< boolalpha << flag<<endl;
	return  0;
}

此处因为我c++还没学完,看到有用容器来做的,待我学完之后再用另一种方法改
https://blog.csdn.net/qq_40858438/article/details/89380815

3.三数之和

https://leetcode-cn.com/problems/3sum/

给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。
示例:
示例

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> rs;
        int target;
        sort(nums.begin(), nums.end());
        for(int i = 0; i< nums.size(); i++){
            if(i > 0 && nums[i] == nums[i-1]) 
                continue;
            if((target = nums[i]) > 0)  
                break;
            int p = i+1,  q = nums.size()-1;
            while(p <q){
                if(nums[p] + nums[q] + target < 0) 
                    ++p;
                else if (nums[p] + nums[q] + target> 0) 
                    --q;
                else{
                    rs.push_back({target,nums[p], nums[q]});
                    ++p, --q;
                    while(p<q && nums[p] == nums[p-1]) 
                        ++p;
                    while(p<q && nums[q] == nums[q+1]) 
                        --q;
                }
            }
        }
        return rs;   
    }
};

在这里插入图片描述

【来源】
[1]https://zhuanlan.zhihu.com/p/44252579
[2]https://blog.csdn.net/my_mao/article/details/23795319
[3]https://blog.csdn.net/KatherineLeeyq/article/details/51165933
[4]https://www.cnblogs.com/richardcpp/archive/2012/10/15/2724406.html
[5]https://blog.csdn.net/u012027907/article/details/16370625

发布了6 篇原创文章 · 获赞 0 · 访问量 83

猜你喜欢

转载自blog.csdn.net/m0_37836661/article/details/103855695