美文网首页
利用哨兵简化复杂度

利用哨兵简化复杂度

作者: mihope | 来源:发表于2019-02-15 17:00 被阅读0次
// 在数组 a 中,查找 key,返回 key 所在的位置
// 其中,n 表示数组 a 的长度
int find(char* a, int n, char key) {
  // 边界条件处理,如果 a 为空,或者 n<=0,说明数组中没有数据,就不用 while 循环比较了
  if(a == null || n <= 0) {
    return -1;
  }
  
  int i = 0;
  // 这里有两个比较操作:i<n 和 a[i]==key.
  while (i < n) {
    if (a[i] == key) {
      return i;
    }
    ++i;
  }
  
  return -1;
}

// 在数组 a 中,查找 key,返回 key 所在的位置
// 其中,n 表示数组 a 的长度
// 我举 2 个例子,你可以拿例子走一下代码
// a = {4, 2, 3, 5, 9, 6}  n=6 key = 7
// a = {4, 2, 3, 5, 9, 6}  n=6 key = 6
int find(char* a, int n, char key) {
  if(a == null || n <= 0) {
    return -1;
  }
  
  // 这里因为要将 a[n-1] 的值替换成 key,所以要特殊处理这个值
  if (a[n-1] == key) {
    return n-1;
  }
  
  // 把 a[n-1] 的值临时保存在变量 tmp 中,以便之后恢复。tmp=6。
  // 之所以这样做的目的是:希望 find() 代码不要改变 a 数组中的内容
  char tmp = a[n-1];
  // 把 key 的值放到 a[n-1] 中,此时 a = {4, 2, 3, 5, 9, 7}
  a[n-1] = key;
  
  int i = 0;
  // while 循环比起代码一,少了 i<n 这个比较操作
  while (a[i] != key) {
    ++i;
  }
  
  // 恢复 a[n-1] 原来的值, 此时 a= {4, 2, 3, 5, 9, 6}
  a[n-1] = tmp;
  
  if (i == n-1) {
    // 如果 i == n-1 说明,在 0...n-2 之间都没有 key,所以返回 -1
    return -1;
  } else {
    // 否则,返回 i,就是等于 key 值的元素的下标
    return i;
  }
}

相关文章

  • 利用哨兵简化复杂度

  • spring 学习01

    sping 的使命 简化java 开发 最根本的使命:简化Java开发为了降低Java开发的复杂度,Spring ...

  • 对链表进行插入排序

    题目 对一个无序单向链表进行插入排序。 思想 运用哨兵思想,简化链表边界问题。 示例

  • 198. House Robber

    Java Javascript 最优解,思路差不多,写法简化了,空间复杂度小了

  • leetcode 初级算法 数组

    原题目链接 删除排序数组中的重复项 ====>双指针动画演示 双指针解题代码思路 简化代码 复杂度分析:时间复杂度...

  • 数据结构与算法 树 引言 顺序查找 ​ 哨兵的方式 ​ 时间复杂度为O(N) 二分查找查找树的形式我...

  • ES6异步请求

    Promise //Promise其实就是ajax的一个封装方式,简化ajax复杂度//Promise-all适合...

  • 《结构思考力》读书笔记

    结构化的方式,与格式塔心理学的“简化”类似,简化复杂度,减少认知负荷。同时横向加纵向的划分,全面而深入。 先总后分...

  • iOS提高数组遍历性能的小技巧

    利用set提高遍历性能 优化前时间复杂度是O(n²) 优化后时间复杂度是O(n) 利用字典提高遍历性能 优化前时间...

  • 9:Redis哨兵模式

    1:哨兵概念 2:哨兵(哨兵系统)作用 3:启用哨兵 4:主从切换演示 4:哨兵工作原理(配置信息 master ...

网友评论

      本文标题:利用哨兵简化复杂度

      本文链接:https://www.haomeiwen.com/subject/enmheqtx.html