一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置

 1 package com.java.tencent;
 2
 3 import java.lang.reflect.Array;
 4 import java.util.Arrays;
 5 import java.util.HashMap;
 6 import java.util.Map;
 7
 8 public class T_1_twoSum {
 9
10     /*初级解法*/
11     public int[] twoSum(int[] nums, int target) {
12         int[] result = new int[2];
13         for(int i=0;i<nums.length-1;i++){
14             for(int j=i+1;j<nums.length;j++){
15                 if(nums[i] + nums[j]==target){
16                     result[0] = i;
17                     result[1] = j;
18                     break;
19                 }
20             }
21         }
22         return result;
23     }
24
25     /*中级解法*/
26     public int[] twoSum_yh(int[] nums, int target) {
27         Map<Integer,Integer> map = new HashMap<Integer,Integer>();
28         for(int i = 0; i < nums.length; i++){
29             map.put(nums[i], i);
30         }
31         for(int i = 0; i < nums.length; i++){
32             int complement = target - nums[i];
33             if(map.containsKey(complement) && map.get(complement) != i){
34                 return new int[]{ i, map.get(complement) };
35             }
36         }
37         throw new IllegalArgumentException("No two sum solution");
38     }
39
40     /*高级解法*/
41     public int[] twoSum_yh_max(int[] nums, int target) {
42         Map<Integer,Integer> map = new HashMap<Integer,Integer>();
43         for(int i = 0; i < nums.length; i++){
44             int complement = target - nums[i];
45             if(map.containsKey(complement)){
46                 return new int[]{map.get(complement), i };
47             }
48             map.put(nums[i], i);
49         }
50         throw new IllegalArgumentException("No two sum solution");
51     }
52
53     public static void main(String[] args) {
54         /*nums数组任意两个值等于target,返回数据在nums里的位置*/
55         int[] nums = {3,2,3};
56         int target = 6;
57         T_1_twoSum aa = new T_1_twoSum();
58         System.out.println(Arrays.toString(aa.twoSum(nums, target)));
59
60         System.out.println(Arrays.toString(aa.twoSum_yh(nums, target)));
61
62         System.out.println(Arrays.toString(aa.twoSum_yh_max(nums, target)));
63     }
64
65 }

结果:[0,2]

由于循环次数的不同,效率也不同,高级解法的效率最佳。

以上多种解法,看看各位处于什么解题思路上。

希望能帮助大家提高代码水平。

原文地址:https://www.cnblogs.com/Monster-World/p/9609686.html

时间: 2024-10-10 10:26:58

一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置的相关文章

C# 一个数组集合,任意组合,并且不重复

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace listTst { class Program { static void Main(string[] args) { var sw = Stopwatch.StartNew(); var arr

java 判断一个数组中个元素是否为给定字符串的子串。返回一个boolean数组

public class SubString { public boolean[] chkSubStr(String[] p, int n, String s) { boolean [] str=new boolean[n]; for (int i = 0; i < p.length; i++) { int result = s.indexOf(p[i]); if(result!=-1){ str[i]=true; } else{ str[i]=false; } } return str; }

Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一个数组定义困难值是两个相邻元素之间差的最大值。 给一个数组,可以去掉任意一个元素,问剩余数列的困难值的最小值是多少】

A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Mike is trying rock climbing but he is awful at it. There are n holds on the wall, i-th hold is at height ai off the g

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行.牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍.这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次.输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO" 输入例子: 2 1 2 输出例子: YES

求一个数组当中最大(最小)值的两种计算方法

求一个数组当中最大(最小)值的两种计算方法 1.常用方法(以求最大值为例) 1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[5] = { 1, 23, 2, 6, 7 }; 7 int array_length = sizeof(a) / sizeof(a[0]);//数组大小 8 int m

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点).class Solution { public: void CloneList(RandomListNode* pHead){ RandomListNode* cur = pHead; RandomListNode* temp = NULL; while(cur != NULL){ temp = new RandomListNode(0); temp->label = cur->label

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序

思路: 桶排序 N个数,设置 N+ 1 个桶,,一定有一个空桶,,为的是保证最大差值一定是不是出现在同一个桶中: 只要比较 非空桶 的最小值,与前一个 非空桶的最大值,求 最大的差值, 1 package my_basic; 2 3 import java.text.Bidi; 4 import java.util.Arrays; 5 6 public class MaxGap { 7 8 /*给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排

给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置

一般的做法(我自己也这样做了哈哈) public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } throw new IllegalArgumentExceptio