搜索
您的当前位置:首页正文

第一题:两数之和[四种编程,三种解法]

来源:步旅网

题目难度:简单

题目类型:数组

获得收货: java、C++、Python、Scala编程知识、两数之和解题思想、快排算法;

解题流程:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现(重点)。

你可以按任意顺序返回答案。
示例一:


输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例二:

输入:nums = [3,2,4], target = 6
输出:[1,2]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

Java实现:

本文采用快排算法(每次将一个元素放在正确位置);

首先,将原数组拷贝一份,即numsBak,然后 对数组nums进行排序(可以采用快排、归并等排序算法),然后对排好序的数组使用两个指针start和end向中间夹击,分三种情况:

(1)nums[start]+nums[end]>target,end减1;

(2)nums[start]+nums[end]<target,start加1;

(3)nums[start]+nums[end]=target,返回结果;

最后在拷贝数组中找到满足条件的两个原始的下标;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**基本知识
 * 在java中如果是基本类型(int、String等),则实参不会改变(值传递);
如果是对象(集合:Map、数组等),则实参会改变(传的是引用);*/
public class Solution {
   
    //快排算法
    public void quickSort(int[] nums,int low,int high) {
   
        int i=low, j=high;
        if(i>=j)
            return; //如果没有此判断会一一直递归,然后报栈溢出,
        int elem = nums[low]; //不能放第一行,否则排好序退出时会导致ArrayIndexOutOfBoundsException
        //经过一次快排,都会将一个元素放在正确位置,其左边元素比其小,右边元素比其大;
        while(i<j){
   
            while(i<j && nums[j] > elem) j--;
            //如果while没有i<j,可能导致j--,出现nums[j]ArrayIndexOutOfBoundsException;
            if(i<j) nums[i] = nums[j];
            while(i<j && nums[i]<= elem) i++;
            if(i<j) nums[j] = nums[i];
        }
        nums[i] = elem;
        quickSort(nums,low,i-1);
        quickSort(nums

因篇幅问题不能全部显示,请点此查看更多更全内容

Top