算法实战(数组篇)

数组篇

  • 26.删除有序数组中的重复项
    • 题目详情
    • 题解
  • 27. 移除元素
    • 题解
  • 35. 搜索插入位置
    • 题目详情
    • 题解
  • 66. 加1
    • 题目详情
    • 题解
  • 88. 合并两个有序数组
    • 题目详情
    • 题解
  • 108. 将有序数组转换为二叉搜索树
    • 题目详情
    • 题解
    • 注意
  • 118. 杨辉三角
    • 题目详情
    • 题解
  • 119. 杨辉三角 II
    • 题目详情
    • 题解
  • 136. 只出现一次的数字
    • 题目详情
    • 题解
  • 169. 多数元素
    • 题目详情
    • 题解
    • 摩尔投票算法
      • 摩尔投票算法的优点
      • 摩尔投票算法的缺点

26.删除有序数组中的重复项

题目详情

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。

题解

int removeDuplicates(int* nums, int numsSize) {int i=0,count;for(int j=1;j<numsSize;j++){if(nums[i]!=nums[j])nums[++i]=nums[j];}count=i+1; // i是数组下标,count应该比i多1.return count;
}

27. 移除元素

##题目详情
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

题解

int removeElement(int* nums, int numsSize, int val) {int count=0; // 记录val值的个数for(int i=0;i<numsSize;i++){if(nums[i]==val) // 数组的值等于val值,count++count++;elsenums[i-count]=nums[i];}return numsSize-count;
}

35. 搜索插入位置

题目详情

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

题解

int searchInsert(int* nums, int numsSize, int target) {int low=0,high=numsSize-1;while(low<=high){int mid=(low+high)/2;if(nums[mid]==target)return mid;else if(nums[mid]>target)high=mid-1;elselow=mid+1;}return low; // low指向的位置是target元素应该在数组中存放的位置
}

66. 加1

题目详情

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

题解

int* plusOne(int* digits, int digitsSize, int* returnSize) {for(int i=digitsSize-1;i>=0;i--){if(digits[i]<9){digits[i]++;(*returnSize)=digitsSize;return digits;}else{digits[i]=0;}}int* res=(int*)malloc(sizeof(int)*(digitsSize+1));res[0]=1;for(int i=1;i<digitsSize+1;i++)res[i]=digits[i-1];(*returnSize)=digitsSize+1;return res;     
}

88. 合并两个有序数组

题目详情

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

题解

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int i, j = 0, k = 0, tempNums1[nums1Size];for (i = 0; i < m; i++) // 移动元素到tempNums1中tempNums1[i] = nums1[i];i = 0;while (i < m && j < n) {if (tempNums1[i] < nums2[j]) {nums1[k++]=tempNums1[i++];}else{nums1[k++]=nums2[j++];}}while(i<m){nums1[k++]=tempNums1[i++];}while(j<n){nums1[k++]=nums2[j++];}
}

108. 将有序数组转换为二叉搜索树

题目详情

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

题解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* travel(int nums[],int low,int high){if(low>high) return NULL;int mid=(low+high)/2;struct TreeNode* root=(struct TreeNode*)malloc(sizeof(struct TreeNode));root->val=nums[mid];root->left=travel(nums,low,mid-1);root->right=travel(nums,mid+1,high);return root;
}struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {struct TreeNode* head=travel(nums,0,numsSize-1);return head;
}

注意

// 第一种
struct TreeNode{int data;struct TreeNode* left;struct TreeNode* right;
}TLnode;// 第二种
struct TreeNode{int data;struct TreeNode* left;struct TreeNode* right;
};// 为第一种的话,函数的返回值可以写为 TLnode 或 struct TreeNode
// 为第一种的话,函数的返回值可以写为 struct TreeNode

118. 杨辉三角

题目详情

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

题解

int** generate(int numRows, int* returnSize, int** returnColumnSizes){//返回的是二维数组,所以需要保存每一行的信息*returnSize = numRows;  // 返回有几列*returnColumnSizes = (int *)malloc(sizeof(int)*numRows);//returnColumnSizes储存杨辉三角每一行元素的个数int** res = (int**)malloc(sizeof(int*)*numRows);for (int i = 0; i < numRows; i++) {(*returnColumnSizes)[i] = i+1;res[i] = (int*)malloc(sizeof(int)*(i+1));res[i][0] = 1;res[i][i] = 1;for (int j = 1; j < i; j++) {res[i][j] = res[i-1][j] + res[i-1][j-1]; }}return res;
}

119. 杨辉三角 II

题目详情

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:

输入: rowIndex = 0
输出: [1]
示例 3:

输入: rowIndex = 1
输出: [1,1]

题解

int* getRow(int rowIndex, int* returnSize) {*returnSize = (rowIndex + 1);int** arr = (int**)malloc(sizeof(int*) * (rowIndex+1));int i, j;for (i = 0; i < rowIndex+1; i++) {arr[i] = (int*)malloc(sizeof(int) * (i + 1));arr[i][0] = 1;arr[i][i] = 1;for (j = 1; j < i; j++) {arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}return arr[rowIndex];
}

136. 只出现一次的数字

题目详情

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

输入:nums = [2,2,1]
输出:1
示例 2 :

输入:nums = [4,1,2,1,2]
输出:4
示例 3 :

输入:nums = [1]
输出:1

题解

int singleNumber(int* nums, int numsSize) {int res=0;for(int i=0;i<numsSize;i++)res^=nums[i];return res;
}

169. 多数元素

题目详情

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3
示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

题解

int majorityElement(int* nums, int numsSize) {int i, vote = 0,elector; // vote 投票数 elector 选举者(把数组里面的数字看做选举者)for (i = 0; i < numsSize; i++) {if (!vote) {elector = nums[i];}if (elector == nums[i])vote++;elsevote--;}return elector;
}

摩尔投票算法

该算法的核心就是对拼消耗

摩尔投票算法的优点

时间复杂度低:算法只需要遍历数组两次,时间复杂度为O(n),其中n是数组长度。
空间复杂度低:算法只需要常数级的额外空间,因此空间复杂度为O(1)。 ●
高效:适用于大规模数据,能够在较短时间内找到主要元素。

摩尔投票算法的缺点

  1. 不适用于所有情况:==算法要求主要元素的出现次数超过一半,因此对于没有主要元素的情况不适用。 ==
  2. 需要额外验证:算法找到候选主要元素后,还需要额外的遍历来验证其是否真的满足条件。
    摩尔投票算法

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

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

相关文章

数学建模实战Matlab绘图

二维曲线、散点图 绘图命令&#xff1a;plot(x,y,’line specifiers’,’PropertyName’,PropertyValue) 例子&#xff1a;绘图表示年收入与年份的关系 ‘--r*’:--设置线型&#xff1b;r:设置颜色为红色&#xff1b;*节点型号 ‘linewidth’&#xff1a;设置线宽&#xff1…

【代码编辑器】VS Code安装下载教程及后续基本配置(一)[小白看这一篇足够了,手把手教会]

前言 Visual Studio Code&#xff08;简称“VS Code” &#xff09;是Microsoft在2015年4月30日[Build]开发者大会上正式宣布一个运行于 [Mac OS X]、[Windows]和[ Linux]之上的&#xff0c;针对于编写现代[Web]和[云应用]的跨平台[源代码编辑器],可在桌面上运行&#xff0c;并…

洛谷-P1802-5 倍经验日

5 倍经验日 题目背景 现在乐斗有活动了&#xff01;每打一个人可以获得 5 倍经验&#xff01;absi2011 却无奈的看着那一些比他等级高的好友&#xff0c;想着能否把他们干掉。干掉能拿不少经验的。 题目描述 现在 absi2011 拿出了 x x x 个迷你装药物&#xff08;嗑药打人…

SQL字典

引言 本文是笔者在学习Oracle数据库的一些基本操作时&#xff0c;针对一些词汇的理解进行记录&#xff0c;形成一份SQL字典&#xff0c;其中包含了单词表和符号表&#xff0c;供大家进行学习交流。 单词表 单词表 序号单词注释用途例句备注1create创建CREATE DATABASE 用于创建…

自定义指令实现按钮防抖

项目中经常会遇到防抖这个场景&#xff0c;比如&#xff0c;页面滚动事件&#xff1b;输入框自动搜索等。为了方便统一管理&#xff0c;提高项目代码的可维护性。我们可以利用Vue的自定义指令完成这个功能。 自定义指令 生命周期/钩子函数 自定义指令拥有自身的生命周期&…

SQL Server 数据表模糊查询(like 用法)以及查询函数

文章目录 一、模糊查询&#xff08;like&#xff09;二、查询函数 一、模糊查询&#xff08;like&#xff09; 在SQL Server Management Studio (SSMS) 中&#xff0c;进行模糊查询主要是通过使用like操作符来实现的。like操作符用于在where语句中搜索列中具有指定模式的数据。…

5G基站节能及数字化管理解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

JVM工作原理与实战(二十二):方法区的垃圾回收

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、Java的内存管理和自动垃圾回收 二、方法区的垃圾回收 1.回收条件 2.手动触发垃圾回收 3.方法区的垃圾回收案例 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和…

面试题总结-分布式总结

Nginx 篇 【1】简述一下什么是Nginx&#xff0c;它有什么优势和功能&#xff1f; Nginx 是高性能的 HTTP 和反向代理的服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。Nginx主要提供功能有 http服务…

了解Vue中日历插件Fullcalendar

实现效果如下图&#xff1a; 月视图 周视图 日视图 官方文档地址&#xff1a;Vue Component - Docs | FullCalendar 1、安装与FullCalendar相关的依赖项 npm install --save fullcalendar/vue fullcalendar/core fullcalendar/daygrid fullcalendar/timegrid fullcalend…

Python并发与多线程:IO并发(阻塞IO、非阻塞IO、IO多路复用、异步IO)

在Python中&#xff0c;有多种处理并发的方式&#xff0c;其中之一就是使用多线程进行IO并发操作。在IO操作中&#xff0c;有四种常见的方式&#xff1a;阻塞IO、非阻塞IO、IO多路复用和异步IO。 阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;当执行一个IO操作时&…

C++将信息输入到文件内

第一步检查文件是否打开&#xff0c;用到头文件&#xff1a; #include <fstream> #include <sstream> 文件打开的函数为 file.isopen() 信息输入到文件应该为 file << "" << value; 注意是file<< 如图 定义file ofstream f…

产品经理学习-产品运营《用户运营策略》

⽤户画像与⽤户运营策略 什么是用户画像 对产品运营而言&#xff0c;用户画像就是对用户的各种特征贴上标签通过这些标签将用户分成不同的用户群体 为用户提供有针对性的服务。 制作用户画像是为了专注和精准 使产品的服务对象更加聚焦&#xff0c;更加专注&#xff1b;根据产…

Rust - 可变引用和悬垂引用

可变引用 在上一篇文章中&#xff0c;我们提到了借用的概念&#xff0c;将获取引用作为函数参数称为 借用&#xff08;borrowing&#xff09;&#xff0c;通常情况下&#xff0c;我们无法修改借来的变量&#xff0c;但是可以通过可变引用实现修改借来的变量。代码示例如下&…

人口问题1

2023年新生儿数量公布&#xff0c;902万人。跟去年比有所下降&#xff0c;但没有各路预测的降那么多。 搜了下历年新生儿数量&#xff0c;建国以来很快上升到2000w&#xff0c;然后遇到了人民公社、三年灾害有些下滑&#xff1b;逐渐克服困难&#xff0c;克服错误&#xff0c;…

SAP S/4HANA 2023 Fully-Activated Appliance 虚拟机版介绍

注&#xff1a;市面上所有在售虚拟机均为拷贝本人所作的虚拟机&#xff0c;存在各种技术问题&#xff0c;请知悉。 SAP S4HANA 2023 FAA版本内置了四个Client&#xff1a; 1、000&#xff1a;SAP初始Client&#xff0c;原则上不能动&#xff1b; 2、100&#xff1a;只激活了US…

NG+WAF实现应用安全访问

一、基本概念 什么是waf&#xff1f; Web应用防火墙&#xff08;waf&#xff09;是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品&#xff0c;WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用提供安全防护的产品。 什么是ngx_lua_…

SpringMVC数据校验

导包 配置springmvc.xml <bean id"validator" class" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name"providerClass" value"org.hibernate.validator.HibernateValidator ">…

[AIGC] 深入理解Java并发编程:从入门到进阶

深入理解Java并发编程&#xff1a;从入门到进阶 引言 在计算机领域中&#xff0c;针对多核处理器的高并发需求&#xff0c;Java并发编程成为了一项重要的技能。Java提供了丰富的并发编程工具和API&#xff0c;使得开发者能够有效地利用多核处理器的优势。本文将介绍Java并发编…

App 设计工具中的回调

目录 创建回调函数 回调函数编程 回调输入参数 在回调函数之间共享数据 在多个组件之间共享回调 以编程方式创建和分配回调 在代码中搜索回调 更改回调或断开与回调的连接 删除回调 示例&#xff1a;具有滑块回调的 App 回调是在用户与 App 中的 UI 组件交互时执行的…