23王道数据结构代码题全解(二)

本文详细解析23版王道数据结构教材的2.2.3章节部分的代码习题,包括线性表、链表等数据结构问题的C++实现,涵盖暴力解法和优化策略。目前已更新至第14题,涉及合并线性表、有序序列操作、寻找主元素等。部分题目提供最优解,但考试时建议采用简单暴力解法。
摘要由CSDN通过智能技术生成

计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里

代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解。

持续更新,目前更新进度:

  • 线性表 14/14
  • 链表

仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。

2.2.3, 08

image.png

  • 暴力方法,再开一个数组,然后就是循环!
  • 一次循环不行,两次!
  • 参数 m 和 n 为两个线性表的长度
  • 时间复杂度O(m+n),空间复杂度O(m+n)
void change(SqList &list, int m, int n) {
   
  // 前一个线性表[0, m-1], 后一个[m, m+n-1]
  SqList copied = list;
  int k = -1;
  for (int i = m; i < m+n; i++) {
   
    copied.data[++k] = list.data[i];
  }
  for (int i = 0; i < m; i++) {
   
    copied.data[++k] = list.data[i];
  }
  list = copied;
}
  • 当然还有一种四两拨千斤的方法,可以先逆置整个数组,再分别逆置其中的两个线性表
  • 比如说[1, 2, 3, 4]逆置成[4, 3, 2, 1],然后其中一个线性表[4, 3]逆置成[3, 4],另一个[2, 1]逆置成[1, 2],最后结果就是[3, 4, 1, 2]
  • 时间复杂度O(m+n),空间复杂度O(1)
// 逆置,跟第二题类似, l=left, r=right
void reverse(SqList &list, int l, int r) {
   
  if (l > r || r > list.length) return;

  int mid = (l + r) / 2;
  // 注意边界
  for (int i = 0; i <= mid - l; i++) {
   
    swap(list.data[l+i], list.data[r-i]);
  }
}

void change2(SqList &list, int m, int n) {
   
  // 注意参数
  reverse(list, 0, m+n-1);
  reverse(list, 0, n-1);
  reverse(list, n, m+n-1);
}

2.2.3, 09

image.png

  • 递增有序,暴力循环
  • 需要考虑很多边界条件,容易出错
  • 时间复杂度O(n),空间复杂度O(1)
void find_x2(SqList &list, int x) {
   
  // 1.二分找x
  int low = 0, high = list.length - 1, mid;
  while (low <= high) {
   
    mid = (low + high) / 2;
    if (list.data[mid] == x) break;
    else if (list.data[mid] < x) low = mid + 1;
    else high = mid - 1;
  }

  // 2.找到了
  if (list.data[mid] == x && mid != list.length - 1) {
   
    swap(list.data[mid], list.data[mid + 1]);
    return;
  }
  
  // 3.没找到, 此时low>high
  list.length++;
  int i = list.length - 2
  • 21
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
王道数据结构通常指的是由算法专家LeetCode作者石悦(@LeetCode_OJ)在讲解算法数据结构时所推荐的学习路径,这里的“王道”意味着经典、基础且实用。它强调了几个核心的数据结构,如数组、链表、栈、队列、哈希表、树(叉搜索树、AVL树、红黑树等)、图以及动态规划。 在实际的代码实现上,比如在Python中,你可以参考这样的示例: 1. **数组(Array)**:Python列表就是一种内置的数组,可以方便地进行增删改查操作。 ```python nums = [1, 2, 3] ``` 2. **链表(Linked List)**:可以使用`ListNode`类表示节点,并通过指针链接起来。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next head = ListNode(1) head.next = ListNode(2) ``` 3. **树(Tree)**:例如叉搜索树,可以用递归或迭代的方式构建节点并维护特性。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right root = TreeNode(5, TreeNode(3), TreeNode(7)) ``` 4. **哈希表(Hash Table)**:Python的字典(dict)就是一个常见的哈希表实现。 ```python hash_table = {'name': 'Alice', 'age': 20} ``` 学习王道数据结构时,除了编码实践外,理解原理、熟练运用和掌握时间复杂度分析也很重要。如果你有特定的数据结构想要了解具体的实现细节,可以告诉我,我会进一步解释。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mancuoj

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值