原地算法求两数之和

给定一个自增序列数组,总数组中找出两个元素等于目标值,并输出元素的下标。这个题右很多解法,通过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.

相关推荐
佳木逢钺20 分钟前
从火灾模拟到系统热寂:一个双非运维如何用零 GPU 推导出多智能体系统的终极死锁
人工智能·python·算法·多智能体
垆边人似月.23 分钟前
网格最小代价路径,总代价不超过 budget
算法
虚无的纽扣24 分钟前
【力扣刷题】第五天:将 x 减到 0 的最小操作数、最大连续1的个数 III
算法·leetcode·职场和发展
C++ 老炮儿的技术栈28 分钟前
char 造成的数据溢出
linux·服务器·c语言·c++·算法·c
彧azz29 分钟前
B-树学习总结:从结构特性到核心操作的系统复习
数据结构·笔记·b树·学习
sqc233sqc44 分钟前
第 J8 周:ResNeXt-50 算法解析
人工智能·算法
hanlin0310 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
All for pursuit.11 小时前
【动态规划-21】312.戳气球
数据结构·c++·算法·leetcode·动态规划
碧海银沙音频科技研究院13 小时前
基于炬芯ATS3089X自研AEC声学回声消除算法
算法
通问AI13 小时前
在两台 Mac Studio 上跑 800B 模型:MLX + RDMA over Thunderbolt 实测与四道门选型法
算法