数据结构与数组及二分查找法和移除元素解题思路等

数据结构

数据结构是计算机科学中存储、组织数据的一种方式,它使得数据的访问和修改更加高效。不同的数据结构适用于不同的应用场景和需求。下面是一些基本的数据结构类型:

1. 数组(Array):
   - 一种线性数据结构,可以存储固定大小的同类型元素。
   - 访问元素的时间复杂度为 O(1),但插入和删除操作的时间复杂度为 O(n),因为需要移动元素。

2. 链表(Linked List):
   - 由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
   - 插入和删除操作相对容易,时间复杂度为 O(1),但访问特定元素需要 O(n) 时间。

3. 栈(Stack):
   - 一种后进先出(LIFO)的数据结构,只允许在一端进行插入和删除操作。
   - 常用于实现函数调用、撤销操作等。

4. 队列(Queue):
   - 一种先进先出(FIFO)的数据结构,允许在一端添加元素,在另一端删除元素。
   - 常用于任务调度、缓冲处理等。

5. 树(Tree):
   - 一种非线性数据结构,由节点组成,有一个根节点,每个节点可能有多个子节点。
   - 二叉树是每个节点最多有两个子节点的树,用于二叉搜索树、堆等结构。

6. 图(Graph):
   - 由一组顶点和连接这些顶点的边组成,用于表示复杂的关系。
   - 可以是有向图或无向图,用于社交网络、地图导航等。

7. 散列表(Hash Table):
   - 通过散列函数将键映射到存储桶中,用于快速查找、插入和删除。
   - 适用于实现字典、集合等数据结构。

8. 堆(Heap):
   - 特殊类型的树结构,通常用于实现优先队列。
   - 最大堆和最小堆是常见的堆结构,分别用于快速获取最大或最小元素。

每种数据结构都有其特定的使用场景和优缺点。选择合适的数据结构对于编写高效、可维护的代码至关重要。在实际应用中,经常需要根据问题的需求和数据的特性来选择合适的数据结构。

数组

数组是一种基础且广泛使用的数据结构,它用于存储一系列相同类型的数据项。数组中的每个数据项称为一个元素,每个元素可以通过一个索引来访问,这个索引通常是数组中元素的位置编号。

主要特点

1. 连续内存空间:数组中的所有元素在内存中是连续存放的,这意味着它们彼此相邻。

2. 固定大小:一旦创建了数组,其大小就固定了,不能动态改变(虽然某些高级语言提供了动态数组或类似的数据结构)。

3. 索引访问:可以通过索引直接访问数组中的任何元素,访问时间复杂度为 O(1),非常快速。

优缺点

优点:
快速访问:由于元素在内存中是连续存储的,所以访问任何元素都非常快速。
固定大小:数组的大小在创建时确定,这使得内存管理相对简单。

缺点:
固定大小:数组大小一旦确定,就不能动态改变,这在某些情况下可能不够灵活。
内存浪费:如果数组中有很多未使用的空间,可能会造成内存浪费。
插入和删除成本高**:在数组中间插入或删除元素需要移动大量元素来保持连续性,因此操作成本较高。

常见操作

初始化:创建数组并分配内存空间。
访问元素:通过索引直接访问数组中的元素。
遍历:按顺序访问数组中的每个元素。
搜索:查找数组中是否存在特定元素,并返回其位置。
插入:在数组中添加新元素,通常需要移动现有元素。
删除:从数组中移除元素,并可能需要移动后续元素。

示例代码(Python):

# 创建# 创建一个整数数组
arr = [10, 20, 30, 40, 50]

# 访问数组中的第三个元素
print(arr[2])  # 输出: 30

# 遍历数组
for element in arr:
    print(element)

# 插入元素(在Python中,列表提供了动态数组的功能)
arr.append(60)  # 在数组末尾添加元素

# 删除元素
del arr[1]  # 删除索引为1的元素

数组是许多更复杂数据结构的基础,例如动态数组、链表、栈、队列等,它们在不同程度上解决了数组的一些限制。

二分查找法·

def search(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

又称折半查找,是一种效率极高的查找方法。该方法要求顺序表中的元素是有序的,即表中元素按关键字有序,假设有序顺序表中的元素是递增有序的

移除元素

原地移除
 暴力解法
class Solution:
  def removeElement(self,nums:List[int],val:int)->int:
    i,l = 0,len(nums)
    while i < l:
      if num[i] == val:
        for j in range(i+1,l):
          nums[j - 1]=nums[j]
        l-=1
        i-=1
    return l
 快慢指针法
class Solution:
   def removeElement(self,nums:List[int],val:int)->int:
     fast=0
     slow=0
     size=len(nums)
     while fast<size:
       if nums[fast]!=val:
          nums[slow]=nums[fast]
          slow+=1
          fast+=1
return slow

leetcode 904  (水果成蓝)

leetcode 76 (最小覆盖)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值