代码随想录DAY1---数组+二分查找

  1. 定义

    • 数组是一种数据结构,由相同类型的数据元素组成的有序集合。在内存中,数组的元素是连续存储的。例如,一个整数数组int array[5],它可以存储5个整数,这些整数在内存中是一个挨着一个存放的。
  2. 维度

    • 一维数组:是最基本的数组形式,就像上面提到的int array[5],可以把它想象成一排盒子,每个盒子里装着一个相同类型的数据(在这里是整数),通过索引来访问数组中的元素,索引从0开始,所以对于int array[5],可以用array[0]array[1]array[2]array[3]array[4]来访问其中的元素。
    • 多维数组:以二维数组为例,它类似于一个表格。例如int matrix[3][4],可以看作是一个有3行4列的表格,总共可以存储3×4 = 12个整数。在内存中,二维数组的存储方式可以是按行存储(大多数编程语言采用这种方式),即先存储第一行的所有元素,再存储第二行的元素,以此类推。访问二维数组元素时,使用两个索引,如matrix[1][2]表示访问第二行(索引从0开始,所以是1)第三列(索引是2)的元素。更高维度的数组(如三维数组、四维数组等)可以类比理解,三维数组可以想象成一个“立方体”,每个元素需要三个索引来定位。
  3. 用途

    • 存储数据集合:例如,要存储一个班级学生的成绩,可以使用一个一维数组int scores[30],其中每个元素scores[i]代表第i + 1个学生的成绩。如果要存储多个班级学生的成绩,就可以使用二维数组,其中一维表示班级,另一维表示学生在班级中的序号。
    • 实现数据结构:数组是许多其他数据结构的基础。例如,栈和队列可以用数组来实现:对于栈,可以定义一个数组和一个指向栈顶元素的指针,通过入栈和出栈操作来改变指针的位置;对于队列,可以用数组和两个指针(一个指向队头,一个指向队尾)来实现入队和出队操作。
    • 作为函数参数传递数据集合:在函数调用中,当需要传递多个相同类型的数据时,可以使用数组。例如,有一个函数用于计算一组整数的平均值,就可以将整数数组作为参数传递给这个函数,这样函数就可以对数组中的所有元素进行操作,而不需要逐个传递每个整数。
  4. 在内存中的存储方式

    • 如前面所述,数组元素在内存中是连续存储的。对于一维数组,假设数组元素类型为TT可以是intcharfloat等),数组名为array,且数组大小为n,那么array[i]0 <= i < n)的地址可以通过公式&array[i]=&array[0]+i*sizeof(T)来计算。这意味着,通过数组名(它实际上是数组首元素的地址)和索引,就可以快速定位到数组中的任何一个元素;对于多维数组,以二维数组T arr[m][n]为例(按行存储),arr[i][j]0 <= i < m0 <= j < n)的地址可以根据一定的偏移量计算规则来确定,通常是先计算行偏移,再加上列偏移,具体公式与编程语言和编译器的实现有关,但基本原理是基于内存的连续存储特性。
  5. 数组的操作

    • 初始化:数组可以在定义时进行初始化。例如,int arr[5]={1, 2, 3, 4, 5},这就将数组arr的5个元素分别初始化为1、2、3、4、5。对于字符数组,如果要初始化一个字符串,可以使用char str[] = "Hello",编译器会自动在字符串末尾添加字符串结束符'\0'
    • 访问元素:通过索引访问数组元素,如前面提到的一维数组和二维数组的访问方式。需要注意的是,访问数组元素时要确保索引在合法范围内,否则会导致数组越界访问,这是一种常见的编程错误,可能会引起程序崩溃或产生不可预测的结果。
    • 遍历数组:可以使用循环来遍历数组中的所有元素。对于一维数组int array[5],可以使用for循环来遍历,例如:
      for(int i = 0; i < 5; i++){
        cout << array[i] << " ";
      }
      
      对于二维数组int matrix[3][4],可以使用嵌套的for循环来遍历:
      for(int i = 0; i < 3; i++){
        for(int j = 0; j < 4; j++){
          cout << matrix[i][j] << " ";
        }
        cout << endl;
      }
      

你可能感兴趣的:(代码随想录,leetcode,c++,数据结构,算法)