LeetCode 167. Soma de dois números II-Input Ordered Array, 15. Soma de três números

tema

Dada uma matriz ordenada que foi organizada em ordem crescente, encontre dois números de forma que sua soma seja igual ao número de destino.

A função deve retornar esses dois valores subscritos índice1 e índice2, onde índice1 deve ser menor que índice2. ligação

Explicação: Os
valores subscritos retornados (índice1 e índice2) não são baseados em zero.
Você pode presumir que cada entrada corresponde apenas a uma resposta única e não pode reutilizar os mesmos elementos.

Ideias

HashMap, O(n)Scan, Findtarget - numbers[i]

class Solution {
    
    
    public int[] twoSum(int[] numbers, int target) {
    
    
        Map<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];
        int left = 0, right = numbers.length - 1;    
        while(left < right){
    
    
            int sum = numbers[left] + numbers[right];
            if(sum < target){
    
    
                left++;
            }else if(sum > target){
    
    
                right--;
            }else{
    
    
                res[0] = left + 1;
                res[1] = right + 1;
                return res;
            }
        }
        return res;
    }   
}

No entanto, o Mapa requer espaço extra e ponteiros duplos são melhores. Também existe uma solução de dois pontos, mas for循环é fixada em um numbers[i]e depois em dois pontos de pesquisa, não parece tão bom quanto um ponteiro duplo direto.

class Solution {
    
    
    public int[] twoSum(int[] numbers, int target) {
    
    
        Map<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];
        int left = 0, right = numbers.length - 1;    
        while(left < right){
    
    
            int sum = numbers[left] + numbers[right];
            if(sum < target){
    
    
                left++;
            }else if(sum > target){
    
    
                right--;
            }else{
    
    
                res[0] = left + 1;
                res[1] = right + 1;
                return res;
            }
        }
        return res;
    }
}

tema

Dado um array nums contendo n inteiros, determine se existem três elementos a, b, c em nums, de modo que a + b + c = 0? Encontre todos os triplos que atendem às condições e não se repetem.

Nota: a resposta não pode conter triplas repetidas. ligação

Ideias

Como as condições para classificar a matriz são necessárias aqui, as duas questões são colocadas juntas. Ainda é a ideia de dois números e dois ponteiros, mas precisa ser julgada novamente durante a travessia.

class Solution {
    
    
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> list;

    public List<List<Integer>> threeSum(int[] nums) {
    
    
        int n = nums.length;
        //先排序,方便后面判断重复
        Arrays.sort(nums);
        for (int first = 0; first < n; ++first) {
    
    
        	//判断重复跳过
            if(first > 0 && nums[first] == nums[first - 1]){
    
    
                continue;
            }
            list = new ArrayList<>();
            twoSum(nums, first + 1, n - 1, 0 - nums[first]);
        }
        return ans;
    }

    void twoSum(int[] arr, int start, int end, int target){
    
    
        int first = start - 1;
        int left = start, right = end;
        while(left < right){
    
    
        	//这里同样判断重复
            if (left > start && arr[left] == arr[left - 1]) {
    
    
                left++;
                continue;
            }
            int sum = arr[left] + arr[right];
            if(sum < target){
    
    
                left++;
            }else if(sum > target){
    
    
                right--;
            }else{
    
    
                list.add(arr[first]);
                list.add(arr[left]);
                list.add(arr[right]);
                ans.add(list);
                list = new ArrayList<>();
                left++;
                right--;
            }
        }
    }
}

Acho que você gosta

Origin blog.csdn.net/qq_42007742/article/details/107460753
Recomendado
Clasificación