代码编织梦想

解题思路:

第一种是循环遍历,让每一个元素都和后面的元素进行相加然后和目标值进行比较,然后进行输出,第一层循环控制当前比较的元素,第二层循环控制当前比较的次数,这里使用双重for循环,时间复杂度为O(n^2),不符合要求,代码示例如下

public static void main(String[] args) {
        int data[] = {2,7,9,10,12,15};
        int target = 14;
       //第一反应,循环遍历,一个一个相加进行比较
        for(int i=0;i<data.length;i++) {
            //每一个数需要比较几次
            for (int j=1+i;j<data.length;j++) {
                int total = data[i] + data[j];
                if (total == target) {
                    System.out.println("目标数:"+target+",Num1="+data[i]+",Num2="+data[j]);
                }
            }
        }
}

第二种是使用Map来代替一层for循环,遍历数组元素,使用map.containsKey方法判断集合中是否存在目标值-当前元素的值,如果不存在,将元素作为key,元素对应的数组下标作为value存到map中,如果存在,就说明找到了,进行输出,这种时间复杂度为O(n)符合要求,代码如下

public static void main(String[] args) {
        int data[] = {2,7,9,10,12,15};
        int target = 14;
       
        //第二种,使用map结构代替一层for循环
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<data.length;i++) {
            //使用map来判断,判断map中是否含有
            if (map.containsKey(target-data[i])) {
                Integer integer1 = map.get(target - data[i]);
                System.out.println("目标数:"+target+",Num1="+data[integer1]+",Num2="+data[i]);
                break;
            }
            //没有就将值作为key,下标作为value放在map中
            map.put(data[i],i);

        }
    }

注;以后遇到使用双重for循环遍历查找元素的情况,都可以考虑一下是否可以使用map来替换一层,减少时间复杂度。亲测结果:第一种执行时间在40~88ms之间,第二种执行时间在1~5ms之间,显然第二种执行效率要快的多!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guliudeng/article/details/130722205

从一道go逆向出发,讨论类tea的逆算法-爱代码爱编程

tea代码很短,经常被直接复制为源码(而不是像标准算法那样调库)。在ctf逆向中也算比较常见,复杂度适中。 例题是一道go逆向,经go parser处理后,核心代码如下图。 panic算是go的专有名词,类似异常。 pan

算法套路十六——dp求解最长递增子序列lis-爱代码爱编程

算法示例:LeetCode300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6

[c++/pta] 点赞狂魔_点赞狂魔pta-爱代码爱编程

点赞狂魔 题目要求解题思路代码头文件 总结 题目要求 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你

决策树与随机森林_决策树和随机森林的关系和联系-爱代码爱编程

决策树解决回归问题时进行平均数计算。 决策树 (1)熵(entropy)与特征节点 熵(entropy),度量着信息的不确定性,信息的不确定性越大,熵越大。信息熵和事件发生的概率成反比。 ■信息熵代表随机变量的复杂度,

力扣第 104 场双周赛 2681. 英雄的力量-爱代码爱编程

原题链接力扣  题目大意:我开始看成连续子段了,写了个递归程序.......  一个数组任选一个子序列,子序列的力量值=最大值平方*最小值。求所有子序列的力量和。 分析过程:如序列长度为n,子序列总数为2的n次幂,显然不可能枚举所有子序列来求解。那么只能锁定子序列最大值和最小值来处理。容易想到先排序,排序后的序列可以取任意ai和aj,那么ai最小

路径规划算法:基于绯鲵鲣算法的路径规划算法-爱代码爱编程

路径规划算法:基于绯鲵鲣优化的路径规划算法- 附代码 文章目录 路径规划算法:基于绯鲵鲣优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MA

亚像素算法(商用源码,点赞收藏)_无限双线性插值能叠加亚像素吗-爱代码爱编程

亚像素算法是用于在像素级别进行图像处理的算法。一种常见的亚像素算法是双线性插值算法, 它可以用于图像缩放和旋转等操作。 1、亚像素算法通常用于图像处理中的插值操作,可以提高图像的精度。下面是一个简单的双线性插值的亚像素算法,你可以参考一下: #include <iostream> using namespace std; double b

代码随想录补打卡 347前k个高频元素 一维数组的背包问题-爱代码爱编程

代码如下  func topKFrequent(nums []int, k int) []int {                 ans := []int{}         设置一个结果数组                 mapnum := map[int]int{}   用map记录对应元素出现的次数                 fo

任务50 通讯录信息管理系统-爱代码爱编程

系列文章 任务50 通讯录信息管理系统 通讯录信息包括:编号、通讯人姓名、联系方式、工作地点、城市、备注等。系统能够完成通讯录信息的查询、更新、插入、删除、排序等功能。 (1) 排序:按编号对所有通讯录的信息进行排序。

目标值的组合总和-爱代码爱编程

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序