给定一个整数数组,返回两个数字的索引,使它们加起来为一个特定的目标。
您可以假设每个输入只有一个解决方案,并且您可能不会两次使用同一个元素。
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]
注:题目大意就是在给定的一个数组中找到两个数组元素之和为给定的target并且返回这两个数组元素在数组中的下标。
解题思路:
依次固定数组的第一个元素,并开始遍历数组(从固定元素的下一个元素开始)看其他元素与固定元素加起来是否等于target若等于则返回这两个数组的下标若不等于则重复此操作。
代码:
/**
* 暴力解决:每次固定一个数再遍历剩余数组中的元素看这两个数之和是否等于target
* 如果等于就返回这两个数在数组中所对应的下标值
*/
public class TowSum01 {
/**
* 定义一个方法返回类型为一个数组,参数为指定的一个数组以及目标值
* 返回的数组元素为对应两个目标数在原来数组中的下标值
* @param nums
* @param target
* @return
*/
public int[] towSum ( int[] nums, int target){
//1.定义一个长度为2的数组用以存储目标数在原来数组中的下标值
int[] result = new int[2];
//2.第一层循环是固定原来数组的元素因为每一个都要固定一次
for (int i = 0; i < nums.length; i++) {
//2.1第二层循环是寻找剩下元素是否有元素与固定的元素加起来值为target
for (int j = i + 1; j < nums.length; j++) {
//2.2将固定元素与剩下的元素加起来看值是否等于target
int sum = nums[i] + nums[j];
if (sum == target) {
//2.3如果sum等于target则将这两个元素的下标放在result数组中并返回result
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
}
解题思路:
使用哈希表求解,将原本数组中的元素作为哈希表中的key将数组元素对应的数组下标作为哈希表中的value,并按照此规则将数组放进哈希表中。遍历此哈希表用target-key的值作为参照并在哈希表中查找是否有符合此值的key,若存在符合此值的key则返回此key的value。
代码:
import java.util.Hashtable;
/**
* 使用哈希表法:将原本数组中的元素作为哈希表中的key将原本数组中元素的下标作为哈希表中的value
* 遍历一次原来的数组将按照以上规则放进哈希表中
* 使用target-key看差值在哈希表中是否存在若存在则返回value
*/
public class TowSum02 {
//1.定义一个方法,返回值类型为长度为2的数组,参数为一个数组以及int类型的target
public int[] towSum(int[] nums,int target){
//2.定义一个长度为2的数组用来存储返回的两个value
int[] result = new int[2];
//3.定义一个哈希表用来存储元本数组的元素以及对应元素的下标值
Hashtable<Integer, Integer> map = new Hashtable<>();
//4.遍历原本的数组将元素作为key将下标作为value存储在map中
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],i);
}
//5.遍历数组元素并用target与数组元素做差看其差值是否在map中
for (int j = 0; j < nums.length; j++) {
//5.1 target与数组元素做差
int diff = target - nums[j];
//5.2 看差值是否在map中且不能是同一个元素
if(map.containsKey(diff) && map.get(diff) != j){
//6.将数组的下标值以及map中找到对应key的value(也就是另一个下标值)放进result中
result[0] = j;
result[1] = map.get(diff);
return result;
}
}
return result;
}
}
总结: 解法一的时间复杂度为O(N²),解法二的时间复杂度为O(N)。
在Ruby中将两个数组相乘并获得相乘值之和的有效方法是什么?我在Ruby中有两个数组:array_A=[1,2,1,4,5,3,2,6,5,8,9]array_B=[3,2,4,2,5,1,3,3,7,5,4]我的目标是获取array_A*array_B的总和值,即1*3+2*2+1*4+...+8*5+9*4。因为我需要在我的应用程序中对它们进行数百万次计算,进行此类计算的最有效方法是什么?这就像矩阵计算:1*N矩阵*N*1矩阵或向量点积。 最佳答案 更新我刚刚根据新评论更新了基准。正在关注Joshua'scomment,注入(i
这是一道简单题题目来自:https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。提示:22nums.length104−109−109nums[i]109−109−109target109只会存在一个有效答案进阶:你可以想出一个时间复杂度小于O(n2)O(n^2)O(n2)的算法吗?示例1:输入:nums=[2,7,11,15],targe
数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组下标从0开始数组内存空间的地址是连续的c++中vector和array的区别1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其内存空间大小是能够改变的。2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的内存空间是固定大小的,申请之后就无法改变。3、vector的底层是array实现的二维数组二维数组在内存的空间地址是连续的704|二分查找思路1、把整个数组一分为二;2、判断目标值在左区间还是右区间,若在左区间,则修改右区间指针的位置;若在右区间,则修改新区间的左区间位置3、重复上述过程,直到lef
一.面试总结 4月20号下午进行了一场大数据视频面试,总结一下踩坑点: 1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。 这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。 2.要在面试10分钟前就进入面试的环境中,以防突发事件。 3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。 注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点
我正在寻找一种方法来进行如下计算:functionsumIntegerUpTo(number){return1+2+3+...+number;}如果您将number作为5传递,函数应该返回1+2+3+4+5的总和。我想知道是否可以不使用循环。 最佳答案 当然是!1+2+3+...+n=n*(n+1)/2 关于javascript-在JavaScript中不使用循环求连续整数之和,我们在StackOverflow上找到一个类似的问题: https://stack
在angularjs(1.6.1)中使用该类型的输入,为9.03到9.05之间的值提供undefined。使用其他值时会重现此问题,其中包括9.62、9.63、17.31。这fiddle重现问题。只需在数字输入中单击向上即可。在linuxmint18下的firefox和chromium上测试。它似乎链接到"step"属性。如果设置为"0.001"就没有问题。但是我在这个应用程序中威胁金钱,所以需要2位小数。注意:如果值最初通过data-numeric-value设置为9.03,则它不是未定义.这个错误有什么解决方法吗?编辑已更新fiddle显示step="0.01"与step="0.0
我开始了欧拉计划。我在问题2上想出了这个代码来计算高达400万的偶数斐波那契数的总和。代码似乎做了很多我想做的事。运行代码时,我确实看到列出了正确的总和。我真正感到困惑的唯一部分是结果中显示的最后一个数字。这是它显示的内容:JS代码:varprevious=0;varcurrent=1;varsum=0;varnext;for(i=1;i结果:210441887983382143286069625711410891544613732(thisisthenumberiwastryingtoget)=>354224848179262000000(confusedastowhythisnum
昨天有人问我这个问题。我必须编写代码将数组分成两部分,以使这两部分之和之间的差异最小。这是我写的代码,复杂度O(n)functionsolution(a){letleftSum=0;letrightSum=a.reduce((acc,value)=>acc+value,0);letmin=Math.abs(rightSum-leftSum);a.forEach((item,i)=>{leftSum+=a[i];rightSum-=a[i];consttempMin=Math.abs(rightSum-leftSum);if(tempMin但后来有人问我如果输入数组长度为1000万,我如
(newDate('2012-12-01')).getMonth()是10而不是11(getMonth是从0开始索引的)。我已经在Firefox、Chrome和Node.js上进行了测试。为什么会这样? 最佳答案 您遇到时区问题。您的JS引擎将字符串解释为UTC,因为它没有进一步指定。来自specificationofDate.parse(由newDate使用):TheStringmaybeinterpretedasalocaltime,aUTCtime,oratimeinsomeothertimezone,dependingont
文章目录前言软件开发整体介绍软件开发流程瑞吉外卖项目介绍项目介绍产品原型展示技术选型功能架构角色开发环境搭建数据库环境搭建maven项目搭建设置静态资源映射后台登录需求分析代码开发功能测试后台退出需求分析代码开发功能测试🌕博客x主页:己不由心王道长🌕!🌎文章说明:SpringBoot项目-瑞吉外卖【day01】🌎✅系列专栏:SpringBoot项目🌴本篇内容:对黑马的瑞吉外卖项目的day01进行笔记和项目实现🌴☕️每日一语:人有退路,就有些许安全感。等到哪一天,你真没了退路,你就发现眼前哪条路都能走,也能通。☕️🚩交流社区:己不由心王道长(优质编程社区)前言从今天开始,正式进入项目阶段。本次的