原地算法求两数之和

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

相关推荐
MartinYeung53 小时前
[论文学习]DP2Unlearning:高效且具保证的大型语言模型遗忘框架(基于差分隐私的 LLM Unlearning 方法)
学习·算法·语言模型
Tian_Hang4 小时前
C++原型模式(Protype)
开发语言·c++·算法
bIo7lyA8v4 小时前
算法复杂度的渐进分析与实际运行时间的差异的技术8
算法
一切皆是因缘际会4 小时前
LLM轻量化联邦微调机理
数据结构·人工智能·数学建模·ai
yuan199975 小时前
欧拉梁静力与屈曲计算的 MATLAB 实现(有限差分法 + 解析解)
开发语言·算法·matlab
玖玥拾5 小时前
C/C++ 数据结构(六)链表迭代器与底层
c语言·数据结构·c++·链表·stl库
牛油果子哥q5 小时前
AVL平衡树与红黑树深度精讲对比,平衡因子、四大旋转原理、着色规则、平衡策略、性能差异与面试手撕全解
数据结构·c++·面试
汉克老师6 小时前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
林间码客6 小时前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe6 小时前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树