首页 > 编程语言 >每日算法之和为S的两个数字

每日算法之和为S的两个数字

时间:2022-12-25 11:11:27浏览次数:45  
标签:return 数字 res 每日 算法 ArrayList array sum 指针

JZ57 和为S的两个数字

题目

输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。

方法1 暴力解题

思路

算法实现

两次循环,两个值相加与sum进行比较,为true直接break即可

代码

package mid.JZ57和为S的两个数字;

import java.util.ArrayList;
public class Solution {
    /**
     * 暴力计算
     * @param array
     * @param sum
     * @return
     * 运行时间     1084ms
     * 占用内存     28348KB
     */
    private ArrayList<Integer> FindNumbersWithSum1(int[] array, int sum) {
        ArrayList<Integer> res = new ArrayList<>();
        if(array.length == 0) return res;
        for(int i = 0; i < array.length; i++) {
            for(int j = 0; j < array.length; j++) {
                if(array[i] + array[j] == sum) {
                    res.add(array[i]);
                    res.add(array[j]);
                    return res;
                }
            }
        }
        return res;
    }
}

方法2 双指针

思路

算法实现

这道题目还有一个条件是数组是升序序列,在方法一中没有用到。这个条件有什么用?
既然数组是有序的,那我们肯定知道和找到一定程度就不找了,我们为什么要从最小的两个数开始相加呢?
我们可以用二分法的思路,从中间开始找。

使用双指针指向数组第一个元素和最后一个元素,然后双指针对撞移动,如果两个指针下的和正好等于目标值sum,那我们肯定找到了,如果和小于sum,说明我们需要找到更大的,那只能增加左边的元素,如果和大于sum,说明我们需要找更小的,只能减小右边的元素。

具体做法:

step 1:准备左右双指针分别指向数组首尾元素。
step 2:如果两个指针下的和正好等于目标值sum,则找到了所求的两个元素。
step 3:如果两个指针下的和大于目标值sum,右指针左移;如果两个指针下的和小于目标值sum,左指针右移。
step 4:当两指针对撞时,还没有找到,就是数组没有。

代码

package mid.JZ57和为S的两个数字;

import java.util.ArrayList;
public class Solution {
    /**
     * 双指针
     * @param array
     * @param sum
     * @return
     * 运行时间
     * 250ms
     * 占用内存
     * 27188KB
     */
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> res = new ArrayList<>();
        int left = 0, right = array.length - 1;
        while(left < right) {
            if (array[left] + array[right] == sum) {
                res.add(array[left]);
                res.add(array[right]);
                return res;
            } else if (array[left] + array[right] < sum){
                left++;
            } else {
                right--;
            }
        }
        return res;
    }
}

标签:return,数字,res,每日,算法,ArrayList,array,sum,指针
From: https://www.cnblogs.com/loongnuts/p/17003784.html

相关文章

  • 猜数字
    #define_CRT_SECURE_NO_WARNINGS1usingnamespacestd;#include<iostream>#include<ctime>#include<cmath>//1、猜数字//intmain()//{//srand((unsignedint)time(NUL......
  • K-近邻算法、欧式距离
     ......
  • MATLAB数学建模(十) | 粒子群优化算法求解二维路径规划问题MATLAB代码讲解
    愿你搜索到人生的最优解hello,大家好。各位可点击左下方阅读原文,访问公众号官方店铺。谨防上当受骗,感谢各位支持!我们在​​MATLAB数学建模(九)|粒子群优化(PSO)算法求解二维路......
  • 差分进化算法求解TSP问题(附MATLAB代码)
    愿你搜索到人生的最优解文案:挽月排版:随心390hello,大家好。各位可点击左下方阅读原文,访问公众号官方店铺。谨防上当受骗,感谢各位支持!在上周的运筹学课中,听老师吹了一波差分进......
  • 改进差分进化算法求解容量受限的车辆路径(CVRP)问题MATLAB代码
    ​​▎​​​​号内搜索​​hello,大家好。各位可点击上方号内搜索搜索往期推文,点击左下方阅读原文,即可访问公众号官方店铺。谨防上当受骗,感谢各位支持!在​​改进差分进化算......
  • 数字化室分的头端有源和传输使用网线/光纤
    ​​数字化​​室分易于演进数字化室分的头端有源,传输使用网线/光纤,从容量演进、可视管理、易部署等方面讲,其架构更容易支持5G演进。当前新建4G场景建议预埋Cat6A网线或者......
  • 近5年来头脑风暴优化算法的研究热点
    hello,大家好。各位可点击左下方阅读原文,访问公众号官方店铺。谨防上当受骗,感谢各位支持!我们在​​头脑风暴优化(BSO)算法(附MATLAB代码)​​这篇推文中讲解了头脑风暴优化算法的......
  • 好书推荐 | 启发式算法的入门书籍
    最近有很多新的小伙伴关注我们公众号,并且在后台私信我们说想学习智能优化算法,让我们推荐一本不那么枯燥的书籍,今天它来了-英文原版是《Howtosolveit.Modernheuristics......
  • 好书推荐 | 近似算法的设计与分析
    前一段时间我们在​​好书推荐|启发式算法的入门书籍​​这篇推文中推荐了一本启发式算法的入门书籍,但后台有很多不同觉得这本书有些简单,想让我们推荐一些高阶的算法设计......
  • 感谢支持 | 《MATLAB智能优化算法:从写代码到算法思想》
    hello,大家好,新书已经上架10天有余,在这里感谢小伙伴各位支持。为了能够让更多渴望学习智能优化算法的小伙伴快速入门,所以今天再次宣传一下《MATLAB智能优化算法:从写代码到算......