数组的知识点

这篇具有很好参考价值的文章主要介绍了数组的知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、概念

数组是存放在连续空间上的相同类型的数据集合。
特点:
1、数组下标都是从0开始的;
2、数组内存空间的地址是连续的。

C++,要注意vector和array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
C++中二位数组在地址空间是连续的。测试代码:

void test_arr() {
    int array[2][3] = {
  {0, 1, 2},
  {3, 4, 5}
    };
    cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl;
    cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
}

int main() {
    test_arr();
}

2、二分查找 主要理解区间定义,对循环条件的影响

特点:前提是有序数组,而且没有无重复元素
题目:https://leetcode-cn.com/problems/binary-search/.
首位置 末尾位置,中间位置。
当中间位置的数字>目标数字 末尾位置挪移到中间位置
当中间位置的数字<目标数字 首位置挪移到中间位置
中间位置<0 中间位置>末尾位置 非法边界。
第一种写法 [left,right]
第二种写法[left,right)

int search(int* nums, int numsSize, int target){
    int left = 0;
    int right = numsSize - 1; 

    while (left <= right){
        int middle = left + ((right - left) / 2); //防止溢出  防止什么溢出

        if (nums[middle] > target) {
            right = middle - 1;
        } else if (nums[middle] < target){
            left = middle + 1;
        }
        else{
            return middle;
        }
    }

    return -1;

}

2.1搜索插入位置(有序数组,要直接想到二分查找)

/*
题目:https://leetcode.cn/problems/search-insert-position/
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值
不存在于数组中,返回它将会被按顺序插入的位置。
特点:有序数组
解题思路:
1、用二分查找,查询是否在数组中
2、若在返回索引
3、若不在,移动数组元素,把target插入数组中。从哪个索引开始移动数组元素,target插入
索引位置是哪?
*/
#include <stdio.h>

#define SIZE 4

int searchInsert(int* nums, int numsSize, int target);

int main()
{
    int nums[SIZE] = {1,3,5,6};
    int target = 0,targetIndex = 0;

    printf("请输入你要查询的数值:");
    scanf("%d", &target);

    targetIndex = searchInsert(nums,SIZE,target);

    if (targetIndex != -1)
    {
        printf("%d的索引是%d\n",target, targetIndex);
    }
    else
    {
        for (int i = 0; i < SIZE; i++)
        {
            printf("%d ",nums[i]);
        }
    }

}

int searchInsert(int* nums, int numsSize, int target)
{
    int left = 0,right = numsSize - 1;       //闭区间
    int middle = 0;

    while (left <= right)                    //循环条件是<开区间还是<= 为什么?<= 因为选择的闭区间的写法。若是选择左闭右开的写法 选择<,并且保证循环过程中区间都是左闭右开。
    {
        middle = left + ((right - left) << 2);   //防止索引越界
        
        if (target < nums[middle])
        {
            right = middle -1;              //保持循环过程中是闭区间
        }
        else if (target > nums[middle])
        {
            left = middle + 1;              //保持循环过程中是闭区间
        }
        else
        {
            return middle;
        }
    }

    return left;        //为什么是left而不是middle。循环结束时,left的值满足。
}

2.2 在排序数组中查找元素的第一个和最后一个位置

题目:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
解题思路:

2.3 x 的平方根

题目:https://leetcode.cn/problems/sqrtx/
解题思路:

2.4 有效的完全平方数

题目:https://leetcode.cn/problems/valid-perfect-square/
解题思路:

3、移除元素

题目:https://leetcode-cn.com/problems/remove-element/
第一种:暴力实现
第二种:双指针:一个快指针,一个慢指针
快指针是寻找这个新数组里所需要的元素(除去所需要删除目标元素的元素)
新数组的更新的位置就是slow。
在快指针获取到的值赋给慢指针就可以了。

int removeElement(int* nums, int numsSize, int val){
    int slowIndex = 0;
    for (int fastIndex = 0; fastIndex < numsSize; fastIndex++){
        if (val != nums[fastIndex]){
            nums[slowIndex++] = nums[fastIndex];
        }
    }

    return slowIndex;
};

类似题目:
26 删除排序数组中的重复项
283 移动零
844 比较含退格的字符串

有序数组的平方

题目:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
第一种方法:暴力解法 每个数平方之后,排序即可
第二种方法:双指针法
考虑题目的特征:有序数组,那么数组的平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法,i指向起始位置,j指向终止位置
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
怎么想到定义了一个新数组?因为数组的元素已经改变,不仅是位置的改变还有内容的改变。

#include <stdio.h>
#include <math.h>

int main()
{
    int originalArr[5] = {-3,-2,4,5,6};
    int newArr[5] = {0};
    int i = 0;
    int j = 4;
    int k = 4;

    /*
    首先比较初始元素的平方和末尾元素的平方大小
    其次,将较大的一方放入新数组的末尾位置,并移动i或j的位置。

    循环结束的条件,i <= j
    */
   while (i <= j)
   {
        if (pow(originalArr[i],2) > pow(originalArr[j],2))
        {
            newArr[k] = pow(originalArr[i],2); 
            i++;
            k--;
        }
        else
        {
            newArr[k] = pow(originalArr[j],2);
            j--;
            k--;
        }
   }

   for (int i = 0; i < 5; i++)
   {
        printf("%d ",newArr[i]);
   }
   

   return 0;

}

长度最小的子数组(滑动窗口)

螺旋矩阵

题目:https://leetcode-cn.com/problems/spiral-matrix-ii/文章来源地址https://www.toymoban.com/news/detail-421304.html

总结

到了这里,关于数组的知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux知识点 -- 进程概念(补充)

    在用户每次使用malloc等函数在进程的堆区申请地址时,用户只需要指定空间的大小,并且会得到一个起始地址,而不会得到结束地址; 因为 堆区的结构都是由 vm_area_struct 管理的,每次malloc都会申请一个该结构体; malloc在堆上申请空间时,只需要知道起始地址,不需要知道结

    2024年02月13日
    浏览(46)
  • ES6知识点汇总(2)--数组

    1、扩展运算符的应用 ES6通过扩展元素符…,就像rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列 主要用于函数调用的时候,将一个数组变为参数序列 能够更简单实现数组复制 数组的合并也更为简洁 注意:通过扩展运算符实现的是浅拷贝,修改了引用指向的值,

    2024年02月13日
    浏览(51)
  • C语言:数组、字符串知识点整理:

    补充 :数组长度= sizeof(arr)/sizeof(arr[0]) 注意: !!! 不适用于当arr 充当形参时(函数传参) !!! 因为函数 传递 的是 int arr[0] 的 地址(指针) ,而 不是数组内容 , 若在此情况计算整形数组长度         在X86系统下,指针大小为 4 ,所以计算结果为4/4=1;       

    2024年03月10日
    浏览(61)
  • AUTOSAR知识点 之 XCP (二):XCP基础概念

    目录 1、概述 2、概念解读 2.1、MCD-X(X= 123) 2.2、CTO与DTO 2.3、Polling模式

    2024年02月08日
    浏览(36)
  • C语言零碎知识点之字符串数组

    在C语言中字符串数组有两种表示方法: 第一种, 二维字符数组 可以利用二维字符数组来表示字符串,格式是: char strs[row][col]; 。例如: 其中的 row 表示二维数组中的行,表示有几个字符串;而 col 表示二维数组中的列,表示能存放字符串的最大长度。 第二种, 字符指针数

    2024年01月18日
    浏览(50)
  • 论文笔记--网络重要节点排序方法综述(概念性知识点)

    任晓龙, 吕琳媛 度中心性:节点的直接邻居数目 半局部中心性:节点四层邻居的信息 k-shell分解:度中心性的扩展,根据节点在网络中的位置来定义,越在核心的节点越重要 1.1度中心性(DC) 节点的度分为入度和出度;权重为与节点相连的边的权重之和 优缺点: 优点:简单

    2024年02月05日
    浏览(35)
  • MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

    ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三章课后习题的过程中,我给大家拓展了一些讲义中没有

    2024年04月22日
    浏览(54)
  • c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

    总结:视频中对于多线程讲的非常透彻,从线程基础概念—.net不同版本出现的线程方法—多线程常出现问题—双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。 视频 线程:程序执行的最小单位,任何操作都是由线程完成的,使用同步时,资

    2024年02月11日
    浏览(59)
  • Js水几个基础知识点:数组的操作,字符串和数组之间的互转,持续补充,欢迎关注

    一、插入 / 删除元素: 我们就不从创建开始讲了,那个太基础了,js创建数组一般都直接let arr = […,…,…],有部分仁兄喜欢new Array(…, …, …),这样看起来可能高级点,结果是一样的哈。 这里我们直接来讨论插入元素: 1、在末尾插入 / 删除元素(push / pop,操作原数组)

    2024年02月09日
    浏览(59)
  • 本文将从云原生的概念、背景知识、Kubernetes架构及核心组件、应用场景、案例研究等方面深入剖析云原生课程的相关知识点

    作者:禅与计算机程序设计艺术 2020年,技术快速发展,云计算火爆。云原生领域也随之蓬勃发展。云原生已经成为大势所趋,大量企业都在逐渐转型云原生应用架构。国内外云服务厂商也纷纷推出基于Kubernetes的服务平台,而Kubernetes又是云原生开源技术体系的一部分。为了帮

    2024年02月07日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包