算法分类数组经典题目

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 算法分类数组经典题目

算法分类——数组经典题目

数组是大多数程序语言中最基本的数据结构之一,也是用得最多的数据结构之一,因此对数组的操作和应用非常重要。在本文中,我们将会介绍一些数组的经典题目,它们在算法考试和编程面试中出现的概率非常高。

1. 两数之和

题目描述:

给定一个整数数组nums和一个目标值target,请在数组中找出和为目标值的两个整数。


你可以假设每个输入整数只会对应一个答案。


但是,你不能重复利用这个数组中同样的元素。

示例:

给定nums = [2, 7, 11, 15], target = 9
因为nums[0] + nums[1] = 2 + 7 = 9
所以返回[0, 1]

代码实现:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for i, num in enumerate(nums):
            if target - num in hashmap:
                return [hashmap[target - num], i]
            hashmap[num] = i

思路解析:

本题可以用哈希表的方式来解决。我们可以建立一个哈希表,用来存储每个数及其对应的下标,然后遍历数组,对于每个数,我们在哈希表中查询是否存在有相加等于target的数,如果存在,就可以返回答案。

时间复杂度:O(n)

空间复杂度:O(n)

2. 移动零

题目描述:

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

代码实现:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i, j = 0, 0
        while j < len(nums):
            if nums[j] != 0:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
            j += 1

思路解析:

本题可以采用双指针的方式解决。假设有两个指针i和j,其中i指向当前已经处理好的序列的尾部,j则是当前遍历到的下标。每次将nums[j]与nums[i]交换,这样就能保证0都移到了数组的末尾。

时间复杂度:O(n)

空间复杂度:O(1)

3. 买卖股票的最佳时机

题目描述:

给定一个数组,它的第i个元素是一支给定股票第i天的价格。


如果你最多只允许完成一次交易(买一次和卖一次),设计一个算法来计算你所能获取的最大利润。


注意你不能在买入股票前卖出股票。

示例:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第2天(股票价格 = 1)的时候买入,在第5天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。
注意利润不能是7-1 = 6, 因为卖出价格需要大于买入价格。

代码实现:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        min_price, max_profit = float('inf'), 0
        for price in prices:
            min_price = min(min_price, price)
            max_profit = max(max_profit, price - min_price)
        return max_profit

思路解析:

本题可以采用贪心算法的思路来解决。我们可以遍历整个数组,用min_price来记录历史最低价格,用max_profit来记录当前最大利润。

时间复杂度:O(n)

空间复杂度:O(1)

4. 旋转数组

题目描述:

给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。

示例1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转3步,即将数组[1,2,3,4,5,6,7]变为[7,6,5,4,3,2,1],然后截取前三个元素[7,6,5],再将剩下的元素[4,3,2,1]反转,最后将两个子数组拼接即可得到结果[5,6,7,1,2,3,4]。

示例2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转2步,即将数组[-1,-100,3,99]变为[99,3,-1,-100],注意k可以大于数组长度,所以需要先对k做取模运算,如k=2时表示向右旋转2个位置,其实就是向右旋转2个位置之后又返回到了原来的位置,即k=2 % len(nums) = 2。

代码实现:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)
        nums[:len(nums) - k] = reversed(nums[:len(nums) - k])
        nums[len(nums) - k:] = reversed(nums[len(nums) - k:])
        nums.reverse()

思路解析:

本题可以采用旋转数组的思路来解决。就是先将整个数组反转一遍,然后将前k个元素和后面的元素分别进行反转,最后得到旋转后的数组。

时间复杂度:O(n)

空间复杂度:O(1)

5. 存在重复元素

题目描述:

给定一个整数数组,判断是否存在重复元素。


如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。

示例1:

输入: [1,2,3,1]
输出: true

示例2:

输入: [1,2,3,4]
输出: false

代码实现:

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(set(nums)) != len(nums)

思路解析:

本题可以先将数组进行去重,然后比较去重后的数组长度和原始数组长度是否一致来判断是否存在重复元素。

时间复杂度:O(n)

空间复杂度:O(n)

6. 只出现一次的数字

题目描述:

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


找出那个只出现了一次的元素。

示例:

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

代码实现:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res ^= num
        return res

思路解析:

本题可以采用异或运算的方式来解决。因为异或运算有一个很好的性质:任何数和自己本身异或都等于0,即a ^ a = 0,且异或运算


相关文章
|
12天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
9天前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
|
1天前
|
人工智能 算法
图搜算算法分类
图搜索算法是计算机科学中用于遍历或搜索图结构(由节点和边组成的数学结构)的技术,常应用于路径规划、网络分析、人工智能等领域。下面是对几种常见图搜索算法的简要说明:
|
3天前
|
机器学习/深度学习 存储 算法
数据结构与算法:数组的操作
数据结构与算法:数组的操作
|
6天前
|
机器学习/深度学习 分布式计算 算法
在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)
【6月更文挑战第28天】在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)、数据规模与特性(大数据可能适合分布式算法或深度学习)、性能需求(准确性、速度、可解释性)、资源限制(计算与内存)、领域知识应用以及实验验证(交叉验证、模型比较)。迭代过程包括数据探索、模型构建、评估和优化,结合业务需求进行决策。
13 0
|
7天前
|
存储 算法 安全
加密算法概述:分类与常见算法
加密算法概述:分类与常见算法
|
9天前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
10天前
|
存储 算法 Java
Java数据结构与算法:线性数据结构之数组
Java数据结构与算法:线性数据结构之数组
|
13天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
14天前
|
算法
基于蝗虫优化的KNN分类特征选择算法的matlab仿真
摘要: - 功能:使用蝗虫优化算法增强KNN分类器的特征选择,提高分类准确性 - 软件版本:MATLAB2022a - 核心算法:通过GOA选择KNN的最优特征以改善性能 - 算法原理: - KNN基于最近邻原则进行分类 - 特征选择能去除冗余,提高效率 - GOA模仿蝗虫行为寻找最佳特征子集,以最大化KNN的验证集准确率 - 运行流程:初始化、评估、更新,直到达到停止标准,输出最佳特征组合