原地算法求两数之和

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

相关推荐
Madison-No728 分钟前
【C++】探秘vector的底层实现
java·c++·算法
Swift社区37 分钟前
LeetCode 401 - 二进制手表
算法·leetcode·ssh
派大星爱吃猫38 分钟前
顺序表算法题(LeetCode)
算法·leetcode·职场和发展
liu****1 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
地平线开发者1 小时前
征程 6 | 征程 6 工具链如何支持 Matmul/Conv 双 int16 输入量化?
算法·自动驾驶
程序员大雄学编程3 小时前
「深度学习笔记4」深度学习优化算法完全指南:从梯度下降到Adam的实战详解
笔记·深度学习·算法·机器学习
小O的算法实验室3 小时前
2022年ASOC SCI2区TOP,基于竞争与合作策略的金字塔粒子群算法PPSO,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
武帝为此3 小时前
【B树与B+树详解】
数据结构·b树
南莺莺3 小时前
邻接矩阵的基本操作
数据结构·算法··邻接矩阵
观望过往4 小时前
【Java数据结构】队列详解与经典 OJ 题目实战
java·数据结构