11

アルゴリズムを実行したいと思い、 leetcodeでこの問題を見つけました

整数の配列が与えられた場合、それらが特定のターゲット数になるように2つの数を見つけます。

関数twoSumは、2つの数値のインデックスを返し、それらが合計してターゲットになるようにする必要があります。ここで、index1はindex2よりも小さくする必要があります。返された回答(index1とindex2の両方)はゼロベースではないことに注意してください。

各入力には正確に1つのソリューションがあると想定できます。

入力:numbers = {2、7、11、15}、target = 9

出力:index1 = 1、index2 = 2

私の解決策はO(n ^ 2)です。これを行うためのより良い方法があるかどうか知りたいですか?O(n)やO(nlogn)のように

import java.util.Arrays;
public class ReturnIndex {
    public int[] twoSum(int[] numbers, int target) {
        int tail = numbers.length-1;
        int[] n = new int[2];
        for (int i=0;i<tail;i++) {
            for(int j=i+1;j<tail;j++) {
                if(target ==(numbers[i]+numbers[j])) {
                    n[0] = i+1;
                    n[1] = j+1;
                }
            }
        }
        return n;
    }

    public static void main(String[] args) {
        int[] s = {150,24,79,50,88,345,3};
        int value = 200;
        ReturnIndex r = new ReturnIndex();
        int[] a = r.twoSum(s,value);
        System.out.println(Arrays.toString(a));
    }
}
4

26 に答える 26

20

配列を並べ替えます。2つのポインタが最初と最後(xとX)を指すようにします。これをループで実行します。

if      (a[X]+a[x] >  N) then X-- 
else if (a[X]+a[x] <  N) then x++
else if (a[X]+a[x] == N) then found.

if (x > X) then no numbers exist.

O(nlogn)時間、O(1)記憶

于 2012-10-24T04:12:07.427 に答える
12

O(n log n)時間、O(1)メモリ(リストは数えません):

  1. まず、リストを並べ替えます。O(n log n)ほとんどのソート関数と同様に、これには時間がかかるはずです。

  2. リストを繰り返し処理します。これO(n)には、外側のループで時間がかかります。この時点で、ソートされたサブリスト内で最も一致する整数のバイナリ検索を実行できますが、これには時間がかかりO(log n)ます。O(n log n)この段階は、合計で終了するはずです。

編集:以下のマックスの答えをチェックしてください。それでもO(n log n)時間とO(1)メモリですが、リストの両端からポインタをたどることで、バイナリ検索を回避します。

O(n)時間、O(n)記憶:

O(1)挿入が必要で、が含まれているハッシュテーブルを作成しO(1)ます。次に、O(n)外側のループで、番号ごとに、がハッシュテーブルにあるiかどうかを確認します。total - iそうでない場合は、追加します。もしそうなら、あなたはあなたの2つの数字を持っています。

いずれにせよ、インデックスを取得するには配列をさらにスキャンする必要がありますが、それは問題ありませんO(n)。時間しかかかりません。それを避けたい場合は、必要に応じてソート済みリストまたはハッシュテーブルに元のインデックスを保持できますが、時間フットプリントではなくメモリフットプリントがあります。

于 2012-10-24T04:12:42.743 に答える
2

O(n log n)以下に、2つの数値を時間内に見つけることができる解決策を見つけることができます。

1- Sort the numbers in ascending (or descending) order             // O(n log n)

2- Compute diff = target - item for each item                      // O(n) 

3- For each calculated diff, look up the calculated value in the sorted items 
   using the Binary search algorithm                               // O(n log n) 

Javaでの完全で機能する実装:

import java.util.ArrayList;

public class NumbersFinder {

    class Item{
        private int value;
        private int index;

        public Item(int value, int index){
            this.value = value;
            this.index = index;
        }

        public int getValue(){
            return value;
        }

        public int getIndex(){
            return index;
        }
    }

    public ArrayList<Item> find(int[] values, int target){      
        ArrayList<Item> items = new ArrayList<Item>();
        for(int i = 0; i < values.length; i++)
            items.add(new Item(values[i], i));

        items = quicksort(items);
        ArrayList<Integer> diffs = computeDiffs(items, target);

        Item item1 = null;
        Item item2 = null;

        boolean found = false;

        for(int i = 0; i < diffs.get(i) && !found; i++){
            item1 = items.get(i);
            item2 = searchSortedItems(items, diffs.get(i), 0, items.size());
            found = item2 != null;
        }
        if(found){
            ArrayList<Item> result = new ArrayList<Item>();
            result.add(item1);
            result.add(item2);
            return result;
        }
        else
            return null;
    }

    // find "value" in the sorted array of "items" using Binary search in O(log n)
    private Item searchSortedItems(ArrayList<Item> items, Integer value, int lower, int upper) {
        if(lower > upper)
            return null;
        int middle = (lower + upper)/2;
        Item middleItem = items.get(middle);
        if(middleItem.getValue() == value)
            return middleItem;
        else if(middleItem.getValue() < value)
            return searchSortedItems(items, value, middle+1, upper);
        else
            return searchSortedItems(items, value, lower, middle-1);
    }

    // Simply calculates difference between the target value and each item in the array; O(n)
    private ArrayList<Integer> computeDiffs(ArrayList<Item> items, int target) {
        ArrayList<Integer> diffs = new ArrayList<Integer>();
        for(int i = 0; i < items.size(); i++)
            diffs.add(target - items.get(i).getValue());
        return diffs;
    }

    // Sorts items using QuickSort algorithm in O(n Log n)
    private ArrayList<Item> quicksort(ArrayList<Item> items) {
        if (items.size() <= 1)
            return items;
        int pivot = items.size() / 2;
        ArrayList<Item> lesser = new ArrayList<Item>();
        ArrayList<Item> greater = new ArrayList<Item>();
        int sameAsPivot = 0;
        for (Item item : items) {
            if (item.getValue() > items.get(pivot).getValue())
                greater.add(item);
            else if (item.getValue() < items.get(pivot).getValue())
                lesser.add(item);
            else
                sameAsPivot++;
        }
        lesser = quicksort(lesser);
        for (int i = 0; i < sameAsPivot; i++)
            lesser.add(items.get(pivot));
        greater = quicksort(greater);
        ArrayList<Item> sorted = new ArrayList<Item>();
        for (Item item : lesser)
            sorted.add(item);
        for (Item item: greater)
            sorted.add(item);
        return sorted;
    }


    public static void main(String[] args){
        int[] s = {150,24,79,50,88,345,3};
        int value = 200;

        NumbersFinder finder = new NumbersFinder();
        ArrayList<Item> numbers = finder.find(s, value);

        if(numbers != null){
            System.out.println("First Number Found = " + numbers.get(0).getValue() + " ; Index = " + + numbers.get(0).getIndex());
            System.out.println("Second Number Found = " + numbers.get(1).getValue() + " ; Index = " + + numbers.get(1).getIndex());
        }
        else{
            System.out.println("No such two numbers found in the array!");
        }
    }
}

出力:

First Number Found = 50 ; Index = 3
Second Number Found = 150 ; Index = 0
于 2012-10-24T04:17:20.153 に答える
1

Pythonの1行のソリューション:

class Solution(object):
    """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
    """
    def twoSum(self, nums, target):            
        x = [[i, nums.index(target-j)] for i,j in enumerate(nums) if nums.count(target-j) > 0 and nums.index(target-j)!=i]

        return x.pop()
于 2016-09-13T11:48:35.910 に答える
1

O(n)時間の解を提供できますが、彼の記憶をO(1)にすることはできません。

最初に、キーと値のペアを宣言します。ここで、keyは整数の配列の値であり、valueは整数の配列のインデックスです。また、キーと値のペアを保持するハッシュテーブルを宣言する必要があります。次に、整数の配列全体を反復処理する必要があります。この配列の値(= sum --array [i])がハッシュテーブルにある場合は、おめでとうございます。見つからない場合は、ハッシュテーブルに格納されます。

したがって、費やされる時間全体は、ハッシュテーブルを挿入してクエリする時間です。メモリはハッシュテーブルのサイズです。

私の英語はあまり上手ではありません。お役に立てれば幸いです。

public static void main(String args[]) {
    int[] array = {150,24,79,50,88,345,3};
    int sum = 200;


    Map<Integer,Integer> table = new HashMap<>();
    StringBuilder builder = new StringBuilder();
    for(int i=0;i<array.length;i++){
        int key = sum - array[i];
        if(table.containsKey(key)){
            builder.append("index1=").append(table.get(key)).
                    append(" index2=").append(i);
        }else{
            table.put(array[i],i);
        }
    }
    System.out.println(builder);
}

于 2018-12-27T09:59:43.970 に答える
1

上記の@Prayerのように、ここに受け入れられた答えがあります。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] resultarray=new int[2];
        for (int i=0;i<nums.length-1;i++){
            for(int k=i+1;k<nums.length;k++)
            {
                 if(target==nums[i]+nums[k])
                 {
                     resultarray[0]=i;
                     resultarray[1]=k;
                 }
            }
        }
        return resultarray;
    }
}
于 2019-07-24T04:07:06.543 に答える
1

2和問題の素朴な解決策はO(n^2)、stnは提供された数値の配列の長さです。

ただし、これまでに見た値のハッシュマップ(key = number、value = index)をO(1)使用し、数値を反復処理するときに補数がすでに存在するかどうか()を確認することで、より適切に処理できます。このアプローチは、ソートされていないアレイに最適です。

  • 実行時の複雑さ:O(n)
  • スペースの複雑さ:O(n)-解決策がある場合でも、実際にはこれはO(n/2)

OPの質問を考えると:

  • 入力配列がソートされているかどうかを指定しませ(したがって、入力配列は何でもかまいません)。
  • 具体的には、実際の数ではなく、提供された配列のインデックスを要求します。配列を並べ替えるあらゆる種類のソリューションでは、事前にそれをコピーするか、並べ替えられた配列と並べ替えられていない配列の間でインデックスのマッピングを維持するか、元の配列を反復処理する必要があります。したがって、選択したアプローチに応じて、メモリ( O(n))または時間()のコストがかかります。O(n)したがって、(現在)受け入れられているソリューションの最初の部分は、厳密に言えば、正しくありません。

最適なソリューション:

  • Pythonの場合:
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        seen = {}
        for j, num in enumerate(nums):
            i = seen.get(target-num, -1)
            if i != -1:
                return [i+1, j+1]
            seen[num] = j
        return [-1, -1]
  • Javaの場合:
import java.util.Map;
import java.util.HashMap;

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        final Map<Integer, Integer> seen = new HashMap<>();
        for (int j = 0; j < nums.length; ++j) {
            final Integer i = seen.get(target - nums[j]); // One hash-map access v.s. two when using contains beforehand.
            if (i != null) {
                return new int[]{ i+1, j+1 };
            }
            numbers.put(nums[j], j);
        }
        return new int[]{-1, -1};
    }
}

構造上、補数がマップ/辞書に存在する場合、保存されるインデックスは常に現在のインデックスよりも低くなることに注意してください。したがって、次の命題が検証されます。

index1はindex2より小さくする必要があります

また、OPの質問には1ベースのインデックスが必要でしたが、これは上記で提供したものですが、参照されているLeetcodeの質問はそれ以降更新されているようで、現在は0ベースです:https ://leetcode.com/問題/2つの合計

これがお役に立てば幸いです。

于 2020-01-25T05:07:34.130 に答える
1

これがO(n)です:

public int[] findSumMatched(int[] numbers, int target) {
    Map<Integer, Integer> mapOfNumbers = new HashMap<Integer, Integer>();
    for (int i = 0; i<numbers.length; i++) {
        int secondNumber = target - numbers[i];
        if (mapOfNumbers.get(secondNumber) != null){
            return new int[] {mapOfNumbers.get(secondNumber), i};
        }
        mapOfNumbers.put(numbers[i], i);
    }
    throw new IllegalArgumentException();
}
于 2020-08-02T01:28:27.997 に答える
1
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        out_list=[] 
        for i in range(len(nums)):
            for j in range(len(nums)):
                if(target-nums[i]) == nums[j] and i != j:
                    out_list.append(i)
        return out_list
于 2021-02-19T18:06:16.507 に答える
0

私はこのようにアプローチします:

  1. 配列を小さい値から小さい値に並べ替えます

  2. アレイを現在の方法でループしますが、ループを早期に終了します

    ターゲット<(numbers [i] + numbers [j])

  3. n [0] + n [1] = targetのような2つの要素の値を取得したら、元の配列を振り返ってそれらのインデックスを見つけます。

于 2012-10-24T04:10:33.060 に答える
0

これがO(nlog(n))を使った私のcppソリューションです:

vector<int> two_sum(vector<int> &numbers, int target) {
    vector<int> result;
    vector<int> numbers_dup = vector<int>(numbers);

    sort(numbers_dup.begin(), numbers_dup.end());

    int left = 0, right = numbers_dup.size() - 1;
    while(left <= right) {
        int sum = numbers_dup[left] + numbers_dup[right];

        if(sum == target) {
            //find the idex of numbers_dup[left] and numbers_dup[right]
            for(int i = 0; i < numbers.size(); i++) {
                if(numbers[i] == numbers_dup[left] || numbers[i] == numbers_dup[right]) {
                    result.push_back(i);
                }
                if(result.size() == 2) {
                    return result;
                }
            }
        }
        else if(sum > target) {
            right--;
        }
        else {
            left++;
        }
    }
}

詳細な説明については、私のブログをチェックしてください。 https://algorithm.pingzhang.io/Array/two_sum_problem.html

于 2016-10-02T02:00:07.917 に答える
0

これは、配列の2つのパスを使用してJavaでHashMapを使用した場合の回答です。配列に重複する要素がなく、ソリューションが1つだけ存在すると仮定します。

import java.util.HashMap;

public class TwoSum {

    int[] index = new int[2];
    public int[] twoSum(int[] nums, int target)
    {
        int length = nums.length;
        //initialize return values assuming that pair for the given target
        //doesn't exist
        index[0]=-1;
        index[1]=-1;
        //sanity check
        if(length<1) return index;

        HashMap<Integer, Integer> numHash = new HashMap<>(length);
        //get the values from array into HashMap assuming that there aren't duplicate values
        for(int i=0; i<length;i++)
        {
            numHash.put(nums[i],i);
        }

        //check for the value in the array and the difference between target and it. Assume that only
        //one such pair exists
        for(int i=0;i<length;i++)
        {
            int val1 = nums[i];
            int val2=target-val1;
            //make sure that it doesn't return the index of the first number in the pait you are searching for
            if( numHash.containsKey(val2) && numHash.get(val2)!=i){
                index[0]=i;
                index[1] =numHash.get(target-nums[i]);
                break;
            }
        }
        return index;
    }
}
于 2017-08-07T04:02:04.670 に答える
0
 public static int[] twoSum(int[] nums, int target) {
        int []resultarray=new int[2];
        for (int i=0;i<nums.length-1;i++){
            for(int k=1;k<nums.length;k++)
            {
                 if(target==nums[i]+nums[k])
                 {
                     resultarray[0]=nums[i];
                     resultarray[1]=nums[k];
                 }
            }
        }
 return resultarray;
    }
于 2017-08-14T10:48:12.427 に答える
0

これは私のPythonソリューションです

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

        copy_dict = {}
        for pos in range(0, len(nums)):
            if nums[pos] not in copy_dict.keys():
                copy_dict[nums[pos]] = [pos]
            else:
                copy_dict[nums[pos]].append(pos)

        def get_sum_indexes(sorted_array, target):
            right_pointer = len(sorted_array) - 1
            left_pointer = 0
            while left_pointer < len(sorted_array) or right_pointer > 0:
                if sorted_array[right_pointer] + sorted_array[left_pointer] == target:
                    return [sorted_array[left_pointer], sorted_array[right_pointer]]
                elif sorted_array[right_pointer] + sorted_array[left_pointer] > target:
                    right_pointer -= 1
                elif sorted_array[right_pointer] + sorted_array[left_pointer] < target:
                    left_pointer += 1
            return None
        sum_numbers = get_sum_indexes(sorted(nums), target)
        if len(copy_dict[sum_numbers[0]]) == 1:
            answer_1 = copy_dict[sum_numbers[0]][0]
        else:
            answer_1 = copy_dict[sum_numbers[0]][0]

        if len(copy_dict[sum_numbers[1]]) == 1:
            answer_2 = copy_dict[sum_numbers[1]][0]
        else:
            answer_2 = copy_dict[sum_numbers[1]][1]
        return sorted([answer_1, answer_2])

print(Solution().twoSum(nums=[-1, -2, -3, -4, -5], target=-8))
print(Solution().twoSum(nums=[-3, -3], target=-6))
于 2017-12-19T20:51:28.623 に答える
0
  1. リストを降順ではない順に並べ替えます。時間計算量がかかりO(nlogn)ます。
  2. 時間内に行うことができる2つの数字を見つけますO(n)
  3. 時間内に行うことができる2つの数値の2つのインデックスを見つけますO(n)

全体的な複雑さはO(nlogn)です。

Pythonでの実装:

class Solution:
  def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    p = nums[:]
    p.sort() #sorting in -> O(nlogn)
    r = len(nums)-1
    l =0 

    #find the indices -> O(n)
    for i in range(len(nums)):
      if(p[l] + p[r]<target): 
        l += 1
      elif (p[l] + p[r]>target): 
        r -=1
      else :
        first_num = p[l]
        second_num = p[r]

    #find the indices of the numbers -> O(n)
    for i in range(len(nums)):
      if(nums[i]==first_num):
        first_index = i
      elif (nums[i]==second_num):
        second_index = i
    return [first_index,second_index]
于 2018-02-27T07:22:48.760 に答える
0

時間計算量O(n)と空間計算量O(n)のSwiftコード:

import UIKit

class Solution{
    func twoSum(_ nums: [Int], _ target: Int) -> [Int]{
        var finalArray = [Int]()
        var newDictionary = [Int:Int]()
        for i in 0..<nums.count{
            let complement = target - nums[i]
            if newDictionary[complement] != nil && newDictionary[complement] != i{

                finalArray.append(newDictionary[complement]!)
                finalArray.append(i)
                return finalArray
            }
            newDictionary[nums[i]] = i

        }
        return []
    }
}

func main(){

    let solution = Solution()
    print("All Good" ,solution.twoSum([1, 3, 4 , 5], 6))
}

main()
于 2018-10-25T05:51:44.987 に答える
0

実数の加算の可換規則のみを利用するハッシュマップを使用するC++のO(n)ソリューション。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> my_map;
          for ( int i = 0 ; i < nums.size(); i++ ){
                if(my_map.find(target - nums[i]) != my_map.end()){
                    return vector<int> {my_map[target - nums[i]], i};
                }  
                my_map[nums[i]] = i ;
          }
    }
};
于 2018-12-27T08:53:00.837 に答える
0

私はほとんどの答えを試しましたが、エッジケースを適切に処理していないようです。したがって、エッジケースを処理するpython3ソリューションに2セントを投じます。Maxのアルゴリズムを使用して実装しました。

   def twoSum(nums, target):
    output=[]
    arr=sorted(nums)
    x=0
    y=-1
    X=len(nums)-1
    while x<X:
        if (arr[X]+arr[x] >  target):
            X-=1 
        elif (arr[X]+arr[x] <  target):
            x+=1
        elif (arr[X]+arr[x] == target):
            #print("Found",arr[X],arr[x])
            num1=arr[x]
            num2=arr[X]
            x+=1
            X-=1 
    for i in range(len(nums)):
        if num1 == nums[i] and y==-1:
            index1=i
            y=i
        elif num2 == nums[i]:
            index2=i         
    return [index1, index2]

注意:次のようなエッジケースと入力を考慮することが重要です。

print(twoSum([3,2,4],  6)) # [1,2]
print(twoSum([3,3],  6))  # [0,1]
于 2019-10-11T02:41:27.247 に答える
0

これが効率的な解決策です。

時間計算量-O(n)および空間計算量-O(1)

Sol:2つのポインター(start_pointerとend_pointer)を使用します。最初に、start_pointerは最初のインデックスを指し、end_pointerは最後のインデックスを指します。

両方の要素を追加します(sum = array [start_pointer] + array [last_pointer]。その後、sum> target要素かどうかを確認します。yesの場合はend_pointerを減らし、それ以外の場合はstart_pointerを増やします。sum = targetの場合、インデックスを取得したことを意味します。

public int[] twoSum(int[] numbers, int target) {

    int[] arr = new int[2]; // to store result
    int sum=0;

    int start_pointer=0;     
    int end_pointer = (numbers.length)-1;

    while(start_pointer<=end_pointer){

        sum=numbers[start_pointer]+numbers[end_pointer]; 

        if(sum>target)
            end_pointer-=1;
        else if(sum<target)
            start_pointer+=1;
        else{
            arr[0]=start_pointer;
            arr[1]=end_pointer;
            break;
        }       
    }       
    return arr;
}
于 2020-03-27T15:07:45.997 に答える
0

HashMapで行うことができ、時間計算量はO(n)になります

public class ReturnIndicesOfElementsAddToSum {

public static void main(String[] args) {
    int[] nums = {2, 7, 11, 15};
    int target = 18;

    if(!getIndices(nums,target)) {
        System.out.println("No such numbers found");
    }

}

static boolean getIndices(int[] nums, int target) {
    Map<Integer,Integer> indexMap = new HashMap<>();
    boolean numFound = false;
    for(int i=0;i<nums.length;i++) {
        int temp = target - nums[i];
        indexMap.put(nums[i], i);
        if(indexMap.containsKey(temp)) {
            System.out.printf("%d and %d adds upto the target value and indices are %d and %d"
                            , nums[i], temp, i, indexMap.get(temp));
            numFound = true;
        }
    }
    return numFound;
}

}

于 2020-05-17T18:46:45.460 に答える
0

HashMapを使用すると、HashMapでの検索の複雑さがO(logn)の順になり、最悪の場合、複雑さがO(nlogn)になる場合にも、これは解決策になります。

    public int[] twoSum(int[] nums, int target) {
        
        int [] resultIndex = null;
        
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        
        for(int i=0;i<nums.length;i++){
            int temp = target - nums[i];
            
            if(map.containsKey(temp)){
                resultIndex = new int[2];
                resultIndex[0]=map.get(temp);
                resultIndex[1]=i;
            }else{
                map.put(nums[i],i);
            }
        }
        return resultIndex;
    }
于 2020-07-08T12:21:18.967 に答える
0

ただ好奇心が強いですが、このO(n)ソリューションの何が問題になっていますか?

public int[] twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length - 1; i++){
        if (nums[i] + nums[i+1] == target)
            return new int[] {i, i+1};
    }
    return null;
}
于 2020-07-30T23:16:58.430 に答える
0

この問題に対する私の解決策は、

public int[] twoSums(int[] unsortedNum, int target) {
        int[] nums = Arrays.copyOf(unsortedNum, unsortedNum.length);
        Arrays.sort(nums);
        boolean isResultFound = false;
        int start = 0;
        int end = nums.length-1;
        while(!(start > end)) {
            if(nums[start]+nums[end] > target){
                end--;
            } else if (nums[start]+nums[end] < target){
                start++;
            } else if(nums[start] + nums[end] == target){
                isResultFound = true;
                break;
            }
        }
        if(isResultFound){
            int s = -1;
            int e = -1;
            for(int i = 0; i< unsortedNum.length; i++){
                if(s != -1 && e != -1){
                    break;
                }
                if(s == -1 && unsortedNum[i] == nums[start]){
                    s = i;
                } else if(e == -1 && unsortedNum[i] == nums[end]) {
                    e = i;
                }
            }
            return new int[] {s,e};
        }
        // for element not found
        return new int[]{-1,-1};
    }

結局、インデックスとして-1、-1を取得した場合、ターゲット要素に合計される可能性のある要素が見つからないと言うことができます。

于 2020-12-14T21:51:08.850 に答える
0
class Solution {
public int[] twoSum(int[] nums, int target) {
    int[] sortedNums = Arrays.copyOf(nums, nums.length);
    Arrays.sort(sortedNums);
            
    int leftSortedIndex = 0;
    int rightSortedIndex = sortedNums.length - 1;
    
    while(leftSortedIndex < rightSortedIndex) {
        int sum = sortedNums[leftSortedIndex] + sortedNums[rightSortedIndex];
        if(sum == target) {
            break;
        } else if(sum < target) {
            leftSortedIndex++;
        } else {
            rightSortedIndex--;
        }
    }
            
    int leftIndex = -1;
    int rightIndex = -1;
    for(int index=0; index < nums.length; index++) {
        if(leftIndex == -1 && nums[index] == sortedNums[leftSortedIndex]) {
            leftIndex = index;
            continue;
        }
        
        if(rightIndex == -1 && nums[index] == sortedNums[rightSortedIndex]) {
            rightIndex = index;
        } 
    }
    
    
    return (new int[] {leftIndex, rightIndex});
}

}

于 2021-06-28T06:46:33.587 に答える
0
class Solution {
public int[] twoSum(int[] nums, int target) {
    int[] sortedNums = Arrays.copyOf(nums, nums.length);
    Arrays.sort(sortedNums);
            
    int leftSortedIndex = 0;
    int rightSortedIndex = sortedNums.length - 1;
    
    while(leftSortedIndex < rightSortedIndex) {
        int sum = sortedNums[leftSortedIndex] + sortedNums[rightSortedIndex];
        if(sum == target) {
            break;
        } else if(sum < target) {
            leftSortedIndex++;
        } else {
            rightSortedIndex--;
        }
    }
            
    int leftIndex = -1;
    int rightIndex = -1;
    for(int index=0; index < nums.length; index++) {
        if(leftIndex == -1 && nums[index] == sortedNums[leftSortedIndex]) {
            leftIndex = index;
        } else if(rightIndex == -1 && nums[index] == sortedNums[rightSortedIndex]) {
            rightIndex = index;
        }
    }
    
    
    return (new int[] {leftIndex, rightIndex});
}

}

于 2021-06-28T06:52:22.663 に答える
0

誰かがCを望んでいるなら、これは役立つかもしれません...それはハッシュテーブルではなくブルートフォースです!

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int i,j,l,target,m,n;
    printf("Enter how many elements you want :\n");
    scanf("%d",&i);
    int array[i];

    printf("Input elements\n" );
    for (j=0;j<i;j++)
    scanf("%d",&array[j]);
    
    printf("[");
    for (l=0;l<i;l++)
    printf(" %d ",array[l] );
    printf("]\n");

    printf("Input the target :");
    scanf("%d",&target);

    for (m=0;m<i;m++)
    {
        for (n=m+1;n<i;n++)
        {
            if ((array[m]+array[n])==target)
            {
                printf("Their indices is \n[%d,%d]",m,n);
            }
        }
    }
    
    return 0;
}
于 2021-09-07T11:21:24.210 に答える