原地算法求两数之和

给定一个自增序列数组,总数组中找出两个元素等于目标值,并输出元素的下标。这个题右很多解法,通过hash可以将时间复杂度降到O(n),但是需要额外开辟空间,那么原地算法非常适合解决此题,及保障时间复杂度,亦可保障空间复杂度的最优。

1、算法思路

cpp 复制代码
/**
 * 展示数组
*/
void   show_arr(uint32* head,int  len)
{
    if(head == NULL){
        perror("arr  is not  init");
        exit(0);
    }
    printf("----------------\n");
    int  i = 0;
    for(i;i<len;i++)
    {
        printf("%d\t",head[i]);
    }
     printf("\n");
}

/**
 * 求两数之和    递增数列
 * @param head  数组首地址
 * @param len   数字长度
 * @param sum   目标数
*/
void   two_sum(int* head,int  len,int sum)
{
  
  int  left = 0 , right = len -1 ;
  int  flag = 0;
  while (left < right)
  {
     /// 两数之和
     int  temp =  head[left]  + head[right];
     int  diff =  temp - sum;
     if(diff > 0)
     {
        /// 差值大于0,说明当前temp大于目标值,需要将右指针左移,减小temp,使得temp靠近目标值
        right --;
     }
      else  if(diff < 0 ) 
     {
        /// 差值小于0,说明当前temp小于于目标值,需要将左指针右移,增大temp,使得temp靠近目标值
        left ++;
     }
     else
     {
        flag = 1;
        /// temp命中目标值
       printf("left=%d,right=%d,temp=%d\n",left,right,temp);
       left ++;
       right --;
     }
  }

  if(flag ==0)
  {
     printf("%s\n"," The arr can not find two number that sum  equal target value  ");
  }

}

2、测试算法

cpp 复制代码
    int  arr[] = { 8 , 12 , 15, 23 , 27 , 34 , 39 ,41 ,46, 55, 67, 76, 83 };
    int* head =  &arr[0];
    int len =  sizeof(arr)/sizeof(int);
  
    two_sum(head,len,70);

下标2对应的是15,下标9对应的是55,两数之和正好是70.

相关推荐
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
科技大视界2 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴2 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe2 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM2 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发2 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师3 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR3 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时3 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
不是az3 小时前
力控相关知识点
算法·机器学习·最小二乘法