LeetCode 刷题1---两数之和

/** 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] */
public class demo1 {    //普通解法    public static int[] twoSum(int[] nums,int target){        HashMap<Integer,Integer> m = new HashMap<Integer, Integer>();        int res[] = new int[2];        for(int i=0;i<nums.length;++i){            if(m.containsKey(target-nums[i])){                res[0]=i;                res[1]=m.get(target-nums[i]);                break;            }            m.put(nums[i],i);        }        return res;    }    //二分法解决方案
/** * 创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端, * 看这两个下标对应的值是否等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。 * 如果大于就让右边的下标向左移,进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配, * 直到所有的数据都处理完 */
    /**     * 辅助类     */    private static class Node implements Comparable<Node> {        int val; // 值        int idx; // 值对应的数组下标

public Node() {        }

public Node(int val, int idx) {            this.val = val;            this.idx = idx;        }

// 比较方法        public int compareTo(Node o) {            if (o == null) {                return -1;            }            return this.val - o.val;        }    }    public static int[] twoSum2(int[] nums, int target) {        // 用于保存返回结果        int[] result = {0, 0};

// 创建辅助数组        Node[] tmp = new Node[nums.length];        for (int i = 0; i < nums.length; i++) {            tmp[i] = new Node(nums[i], i);        }

// 对辅助数组进行排序        Arrays.sort(tmp);

// 记录辅助数组中左边一个值的下标        int lo = 0;        // 记录辅助数组中右边一个值的下标        int hi = nums.length - 1;

// 从两边向中间靠陇进行求解        while (lo < hi) {            // 如果找到结果就设置返回结果,并且退出循环            if (tmp[lo].val + tmp[hi].val == target) {

if (tmp[lo].idx > tmp[hi].idx) {                    result[0] = tmp[hi].idx + 1;                    result[1] = tmp[lo].idx + 1;                } else {                    result[0] = tmp[lo].idx + 1;                    result[1] = tmp[hi].idx + 1;                }                break;            }            // 如果大于目标值,右边的下标向左移动            else if (tmp[lo].val + tmp[hi].val > target) {                hi--;            }            // 如果小于目标值,左边的下标向右移动            else {                lo++;            }        }        return result;    }    public static void main(String args[]) {        long startTime = System.currentTimeMillis();        int arr[]={5,6,7,8,9,10,1,12,3,4,2,3,4,5,7,11};        int target=20;        int res[]=twoSum(arr,target);        for(int i=0;i<res.length;++i){            System.out.println(res[i]);        }        long endTime = System.currentTimeMillis();        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");    }}

原文地址:https://www.cnblogs.com/tianziru/p/10261085.html

时间: 2024-07-31 23:04:05

LeetCode 刷题1---两数之和的相关文章

LeetCode刷题 - (01)两数之和

题目描述 给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解法一 暴力解法 解题思路 最容易想到的就是暴力法,使用两个遍历,查找两数之和是否为target.流程如下: 使用i来遍历

LeetCode刷题8——两数之和

一.要求 二.背景 数组: 数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按有序的形式组织起来的一种形式.抽象地讲,数组即是有限个类型相同的元素的有序序列.若将此序列命名,那么这个名称即为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素.而用于区分数组的各个元素的数字编号则被称为下标,若为此定义一个变量,即为下标变量 三.思路 (1)挨个找两数之和等于目标值,并找对应两个数的索引,当两个数相等的时候 修改代码后运行成功 (2)进阶版:如果是三个数之和呢 原文地址:https

LeetCode刷题-001两数之和

给定一个整数数列,找出其中和为特定值的那两个数.你可以假设每个输入都只会有一种答案,同样的元素不能被重用.示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 1 int* twoSum(int* nums, int numsSize, int target) 2 { 3 int i,j; 4 int* p=(int*)malloc(sizeof(int)*2); 5 for(i=0;

leetcode刷题2:两数相加add_two_numbers

题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 思路: 本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位对齐相加即可. 技巧在于如何处理不同长度的数字

Leetcode(1)两数之和

Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 第一种方法:暴力 执行用时:5352 ms: 内存消耗:12.9MB 效果:非常差 class Solution(object): def twoSum(self, nums, target): """ :type nums:

LeetCode Golang实现 1. 两数之和

1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 方法一: 暴力法: leetCode 给出运行时间 60ms func twoSum(nums []int

LeetCode题解001:两数之和

两数之和 题目 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] Java: 方法一:暴力法 暴力法很简单,就是用两遍循环的方式遍历nums class Solution {

Leetcode第1题:两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素.示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] Python: nums = [2, 7, 11, 15, 29] target = 17 # print(nums[0]) def calcOrder(n

LeetCode刷题-004两个排序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 示例 1:nums1 = [1, 3]nums2 = [2]中位数是 2.0 示例 2:nums1 = [1, 2]nums2 = [3, 4]中位数是 (2 + 3)/2 = 2.5 1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int>&

【LeetCode】[TOP-1] 【两数之和】

题目描述 思路分析 Java代码 代码链接 题目描述 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例 给定 nums = [2, 7, 11, 15], target = 9 ,因为 nums[0] + nums[1] = 2 + 7 = 9 , 所以返回 [0, 1] 思路分析 可以暴力解 可以利用了java集合中map 哈希表的特性,