数据结构(一)—— 数组

news2024/12/24 20:14:53

文章目录

  • 一、数组基础
  • 二、题
    • 1. 704 二分查找
    • 2. 27 移除元素
    • 3. 977 有序数组的平方
    • 4. 209 长度最小的子数组


一、数组基础

数组是存放在连续内存空间上的相同类型数据的集合,也就是说数组内存空间的地址是连续的。
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址,注意:数组的元素是不能删的,只能覆盖。

1、数组初始化分配内存
int record[26] = {0};
2、vector排序函数:sort(A.begin(),A.end());
3、vector res = {1, 2, 3, 4};
4、vector int res(10,0); // 创建一个大小为10的vector
vector<vector> res(10, vector(10, 0)) // 创建一个10*10的二维vector
5、查找vector中的元素

vector<int>::iterator aa = find(visited.begin(), visited.end(), 5);  // 如果vector是空的,出现段错误
if (aa == visited.end())  没找到
else *aa   找到了返回值

PS:vector的底层实现是array,但严格来讲vector是容器,不是数组。之后补充
6、二维数组

int array[2][3] = {
		{0, 1, 2},
		{3, 4, 5}
    };
vector<int> res(10,0); // 创建一个大小为10的vector
vector<vector<int>> res(10, vector<int>(10, 0));

二维int型数组内存地址,相邻数组元素差了4个字节
在这里插入图片描述

二、题

1. 704 二分查找

前提条件:有序数组、无重复元素
着重点:
1、while的退出条件非常重要,小于等于:while(left <= right)
2、取中间值索引时非常重要:int mid = (right - left)/2 + left;
奇数个索引刚好在中间,偶数个索引在中间偏左位置

2. 27 移除元素

题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

双指针,感觉很难想,需要重点2刷。
核心思想:每次fast都会给slow值,除非fast指向了val
在这里插入图片描述

代码如下(示例):

int removeElement(vector<int>& nums, int val) {
    int slow = 0;
    int fast = 0;
    while(fast < nums.size()){  // 每次fast都会给slow值,除非fast指向了val
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}

// 2021年第一次做
int fast = 0;
int slow = 0;
int removeElement(vector<int>& nums, int val) {
       for(fast = 0;fast<nums.size();fast++)
       {
           if(nums[fast] != val) //在快和慢没有分开时,当快指针不为val时,带着slow走
           {                     //在快和慢分开之后,,当快指针不为val,每次赋值结束,slow指针自加
               nums[slow] = nums[fast]; //只要不赋值,慢指针就永远不自加
               slow++;
           }
           //当快指针为val时,快指针自己走,第一次快与慢分开的时候就是第一次碰到val的时候
       }
       return slow;
}

3. 977 有序数组的平方

vector<int> sortedSquares(vector<int>& nums) {
    int k = nums.size() - 1;
    vector<int> res(nums.size(),0);
    int left = 0;
    int right = nums.size() - 1;
    while(right >= left){
    	if(nums[right] * nums[right] >= nums[left] * nums[left]){
            res[k] = nums[right] * nums[right];
            k--;
            right--;
        }else{
            res[k] = nums[left] * nums[left];
            k--;
            left++;
        }
    }
    return res;
}

4. 209 长度最小的子数组

题目:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2

这题做的时候思维僵化了,没有利用好≥这个条件,总觉得应该固定窗口的大小再滑动,没想到可以动态条件窗口的大小,用了三种解法都是暴力解,之后可以看看。
做这题时同时复习了哈希映射和earse函数:
1、earse输入的是数组的迭代器,例:vector.erase(vector.begin());
2、遍历哈希映射的方式
for (auto it = windowfalse.begin(); it != windowfalse.end(); it++)
cout << *it << endl;

// 必须使用单for来完成滑窗
int minSubArrayLen(int target, vector<int>& nums) {
    int res = 999999999;  //INT32_MAX
    int sum = 0;
    int k = 0;
    int left = 0;
    for (int right = 0; right < nums.size(); right++) {
        sum += nums[right];
        while (sum >= target) {
            k = right - left + 1;
            res = res > k ? k : res;  // 题目要求是最小的长度,这个k不一定最小,暂时保存一下
            sum -= nums[left];
            left++;  // 动态滑窗!!窗口的大小不是固定的
        }
    }
    return res == 999999999 ? 0 : res;
}

int minSubQueueLen(int target, vector<int> nums) {
    // 滑窗size为k时
    for (int k = 1; k < nums.size() + 1; k++) {
        unordered_set<int> windowfalse;
        queue<int> window;
        for (int i = 0; i < nums.size(); i++) {
            window.push(nums[i]);
            if (i >= k) {
                // windowfalse.erase(nums[i - k]);  // 哈希映射会删除滑窗中的该元素。。
                window.pop();
            }
            int ans = 0;
            // cout << k << "滑窗";
            /*for (auto it = windowfalse.begin(); it != windowfalse.end(); it++)
            {
                int a = *it;
                ans += a;
            }*/
            // queue是没有遍历操作的,这是很弱智的做法,时间复杂度太高
            for (int i = 0; i < window.size(); i++) {  
                ans += window.front();
                window.push(window.front());
                window.pop();
            }
            if (ans >= target)
                return k;
        }
    }
    return 0;
}

int minSubvectorLen(int target, vector<int>& nums) {
    // 滑窗size为k时
    for (int k = 1; k < nums.size() + 1; k++) {
        vector<int> window;
        for (int i = 0; i < nums.size(); i++) {
            window.push_back(nums[i]);
            if (i >= k) {
                window.erase(window.begin());
            }
            int ans = 0;
            // 时间复杂度太高
            for (int i = 0; i < window.size(); i++) {
                ans += window[i];
            }
            if (ans >= target)
                return k;
        }
    }
    return 0;
}
// 超出时间限制。。双指针暴力解
int minSubArrayLen(int target, vector<int>& nums) {
    // 滑窗size为k时
    for (int k = 1; k < nums.size() + 1; k++) {
        int left = 0;
        for (int right = 0; right < nums.size(); right++) {
            if ((right - left) > (k - 1)) {
                left++;
            }
            int ansleft = left;
            int ansright = right;
            int ans = 0;
            while (ansleft <= ansright) {
                ans += nums[ansleft]; 
                ansleft++;
            }
            if (ans >= target) {
                return k;
            }
        }
    }
    return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

COIG:首个大规模、可商用的中文开源指令数据!

文 | ZenMoore ChatGPT 出现后的这几个月&#xff0c;整个学界和业界的疯狂想必大家都已经看到了。 然而&#xff0c;在背各种各样的动物还有山海经怪兽的英语单词的时候&#xff0c;其实不妨停下来想一想复现中文 ChatGPT 到底缺什么&#xff1f;缺大模型吗&#xff1f;缺工程…

C++的引用

目录 引用概念 引用的用法 做函数形参 优点一 优点二 引用做返回值 让我们更深入的了解引用与指针 语法层引用与指针完全不同的概念 站在底层的角度看指针与引用 笔记类型文章 引用概念 在语言层面上&#xff1a;引用不是定义新的变量&#xff0c;而是给已存在变量再…

大模型带来的Web复兴,会是昙花一现吗?

大家是不是对GPT、对话式AI、生成式AI之类的话题&#xff0c;已经有点审美疲劳了&#xff1f; 写这篇文章之前&#xff0c;我有点犹豫&#xff0c;究竟还要不要接着讨论GPT了。最终决定写&#xff0c;是觉得个人用户、开发者&#xff0c;以及正在紧锣密鼓训大模型的AI公司和云厂…

Go | 一分钟掌握Go | 1 - 安装Go

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱原创&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 为什么学Go 为什么要学Go&#xff1f;网上太多广告和说辞了&#xff0c;什…

“SCSA-T学习导图+”首发:路由技术之OSPF入门

本期引言&#xff1a; 路由技术是网络环境中&#xff0c;为不同的节点传输数据提供传输路径的技术&#xff0c;企业网络的拓扑一般会比较复杂&#xff0c;不同的部门或者总部和分支可能处于不同的网段中&#xff0c;此时就需要使用路由协议来连接不同的网段&#xff0c;实现数…

django channels(websocket)的使用,实现网页间实时聊天

目录 一、创建项目mysite和应用chat 1. 创建项目mysite 2. 创建应用chat并添加应用到settings.py的INSTALLED_APPS中 3. 添加模板文件 4. 添加视图及路由 5.配置根路由指定chat应用的路由 6. 集成channels 二、实现聊天服务器 1. 创建一个新文件chat/templates/chat/r…

响应式开发HTNL5CSS3视频播放器

目录 前言 一、本视频播放器需要实现的功能 ​二、代码分布结构 三、部分主要代码 1.index01.html 2.video1.css 3.video1.js 四、images图片资源及视频 五、运行效果 前言 1.本文讲解的响应式开发技术&#xff08;HTML5CSS3Bootstrap&#xff09;的HTML5视频播放器等…

TS-黑马(二)

目录&#xff1a; &#xff08;1&#xff09;ts-类型-字面量与nullish类型 &#xff08;2&#xff09;ts-类型-泛型 &#xff08;3&#xff09;ts-意义 &#xff08;4&#xff09;ts-class语法 &#xff08;1&#xff09;ts-类型-字面量与nullish类型 我们子啊传递参数的时…

以 100GB SSB 性能测试为例,通过 ByteHouse 云数仓开启你的数据分析之路

动手点关注 干货不迷路 I. 传统数仓的演进&#xff1a;云数仓 近年来&#xff0c;随着数据“爆炸式”的增长&#xff0c;越来越多的数据被产生、收集和存储。而挖掘海量数据中的真实价值&#xff0c;从其中提取商机并洞见未来&#xff0c;则成了现代企业和组织不可忽视的命题。…

总的所有的全部的完全的整个的整体的: all entire full gross whole total

all entire full gross whole total 所有的,完全的,完整的全部的,整个的,整体的,总的 all entire full gross whole total all entire full gross whole total一些词典的解释allentirefullgrosswholetotal 区别辨析entire、whole、complete、full、total、gross与alltotal&…

【JavaWeb】HTMLCSS

一:B/S 软件的结构 二&#xff1a;前端的开发流程 3、网页的组成部分 页面由三部分内容组成&#xff01; 分别是内容&#xff08;结构&#xff09;、表现、行为。 内容&#xff08;结构&#xff09;&#xff0c;是我们在页面中可以看到的数据。我们称之为内容。一般内容 我们…

【Linux】共享内存(shm)代码实现

文章目录 共享内存介绍最快的IPC形式共享内存示意图共享内存数据结构共享内存函数shmget函数shmfig shmat函数说明&#xff1a; shmdt函数shmctl函数 共享内存的原理小结 共享内存的特点生命周期共享内存的大小共享内存为什么快共享内存没有任何的保护机制即同步互斥扩展内容 代…

《软件开发本质论》读书笔记

目录 第一部分——价值的循环开发取向频繁交付小的&#xff0c;价值大&#xff0c;代价小的特性 测试同时要有业务测试和开发测试开发测试应在代码开发的同时完成甚至先于代码完成 重构第一部分总结 第二部分——说明与论述团队目的自主专精 五卡法预测软件计划控制好自己所参与…

二叉树一定是完全二叉树

一、树的概念及其结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1、树的特点 ①有一个特殊的结点&…

ARM Coresight 及 DS-5 介绍 5 - ARM Cortex-M DS-5 加载 ELF 文件运行

文章目录 1.1.1 DS-5 工程创建1.1.2 DS-5 加载 ELF 脚本创建1.1.3 DS-5 脚本读写 Memory1.1.4 DS-5 扫描脚本 1.1.1 DS-5 工程创建 在使用ARM DS-5 连接 board(或者PFGA)之前首先需要能够扫描到相应的硬件信息&#xff0c;比如对应的cpu的相关信息&#xff1a;coresight 相关组…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自远程内网穿透的文章&#xff1a;【Zblog建站】搭建属于自己的博客网站&#…

【C++】初始化列表,explicit 关键字,静态成员

初始化列表 构造函数内可以对于成员的赋值&#xff0c;故不能称为是初始化&#xff0c;初始化只能初始化依次&#xff0c;C中类对象的初始化可由初始化列表完成 内置类型成员可以通过设置缺省值实现初始化&#xff0c;但对于const修饰的成员、引用成员、没有默认构造函数的自…

hive解析json

目录 一、背景 二、hive 解析 json 数据函数 1、get_json_object 2、json_tuple 3、使用嵌套子查询(exploderegexp_replacesplitjson_tuple)解析json数组 4、使用 lateral view 解析json数组 一、背景 我们进行ETL(Extract-Transfer-Load) 过程中,经常会遇到从不同数据…

编码拓展:链接库

一.认识链接库 1.1库 计算机中&#xff0c;有些文件专门用于存储可以重复使用的代码块&#xff0c;例如功能实用的函数或者类&#xff0c;我们通常将它们称为库文件&#xff0c;简称“库”&#xff08;Library&#xff09;。 以 C 语言为例&#xff0c;如下为大家展示的就是…

JUC高级十-并发加锁原理之AbstractQueuedSynchronizer(AQS)

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …