原地算法求两数之和

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

相关推荐
凌肖战5 分钟前
力扣网编程55题:跳跃游戏之逆向思维
算法·leetcode
88号技师1 小时前
2025年6月一区-田忌赛马优化算法Tianji’s horse racing optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
ゞ 正在缓冲99%…1 小时前
leetcode918.环形子数组的最大和
数据结构·算法·leetcode·动态规划
Kaltistss2 小时前
98.验证二叉搜索树
算法·leetcode·职场和发展
知己如祭2 小时前
图论基础(DFS、BFS、拓扑排序)
算法
mit6.8242 小时前
[Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
算法·哈希算法
c++bug3 小时前
动态规划VS记忆化搜索(2)
算法·动态规划
哪 吒3 小时前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
努力写代码的熊大3 小时前
单链表和双向链表
数据结构·链表
军训猫猫头3 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net