Leetcode3——查询数组,twoSum,threeSum,fourSum,最长连续序列

该博客介绍了LeetCode中的数组查询问题,包括如何在数组修改后计算偶数值之和,以及解决两数和、三数和、四数和的问题。通过示例展示了遍历和利用辅助数据结构的解题方法,并强调了避免重复计算和时间复杂度的要求。
摘要由CSDN通过智能技术生成

给出一个整数数组 A 和一个查询数组 queries。
对于第 i 次查询,有 val = queries[i][0], index = queries[i][1],我们会把 val 加到 A[index] 上。然后,第 i 次查询的答案是 A 中偶数值的和。

(此处给定的 index = queries[i][1] 是从 0 开始的索引,每次查询都会永久修改数组 A。)
返回所有查询的答案。你的答案应当以数组 answer 给出,answer[i] 为第 i 次查询的答案。
示例:

输入:A = [1,2,3,4], queries = [[1,0],[-3,1],[-4,0],[2,3]]
输出:[8,6,2,4]
解释:
开始时,数组为 [1,2,3,4]。
将 1 加到 A[0] 上之后,数组为 [2,2,3,4],偶数值之和为 2 + 2 + 4 = 8。
将 -3 加到 A[1] 上之后,数组为 [2,-1,3,4],偶数值之和为 2 + 4 = 6。
将 -4 加到 A[0] 上之后,数组为 [-2,-1,3,4],偶数值之和为 -2 + 4 = 2。
将 2 加到 A[3] 上之后,数组为 [-2,-1,3,6],偶数值之和为 -2 + 6 = 4。

解析:首先计算所有偶数之和。之后遍历queries数组,仅对有改变的A[i]进行操作而不用遍历整个数组。

import java.lang.*;
class Solution {
    public int[] sumEvenAfterQueries(int[] A, int[][] queries) {
        int flag[]=new int  [A.length];//奇偶的标志性数组
        int result[]=new int [A.length];//第i次查询偶数的和
        int sum=0;//偶数的和
        for(int i=0;i<A.length;i++){
            flag[i]=(A[i]%2==0?1:0);//若是偶数则为1,若是奇数则为0
            if(flag[i]==1)sum+=A[i];
        }
        //查询
        for(int i=0;i<A.length;i++){   
            if(Math.abs(A[queries[i][1]]%2)==0)sum-=A[queries[i][1]];
            if((Math.abs(A[queries[i][1]]+queries[i][0]))%2==0)sum+=(A[queries[i][1]]+queries[i][0]);
            A[queries[i][1]]=A[queries[i][1]]+queries[i][0];
            result[i]=sum;
        }
        return result; 
    }
}

题目二:两数和

解析:利用辅助数组(或者Map)

两次遍历:

 class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map =new HashMap<>();
        for(int i=0;i<nums.length;i++){
            map.put(target-nums[i],i);
        }
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])&&map.get(nums[i])!=i){
                return new int[]{i,map.get(nums[i])};
            }
        }
        return null;
    }
}

一次遍历:

 class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map =new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(target-nums[i])){
                return new int []{map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
        }
        return null;
    }
}

题目三:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

import java.lang.*;
import java.util.*;

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new LinkedList<>();
        int low,high;
        int len=nums.length;
        Arrays.sort(nums);
        for(int i=0;i<len-2;i++){
            if(i>0&&nums[i]==nums[i-1]) continue;
            low=i+1;
            high=len-1;
            while(low<high){
                int sum=nums[i]+nums[low]+nums[high];
                if(sum==0){
                    list.add(Arrays.asList(nums[i],nums[low],nums[high]));
                    low++;high--;
                    while(low<high&&nums[low-1]==nums[low])low++;
                    while(low<high&&nums[high+1]==nums[high])high--;
                }
                else if(sum<0)low++;
                else high--;
                
            }
        }
        return list;
    }
}

题目四:四数和

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

import java.lang.*;
import java.util.*;

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list=new LinkedList<>();
        int len=nums.length;
        int low,high;
        Arrays.sort(nums);
        for(int i=0;i<len-3;i++){
            if(i>0&&nums[i]==nums[i-1]) continue;
            for(int j=i+1;j<len-2;j++){
                if(j>i+1&&nums[j]==nums[j-1]) continue;   
                low=j+1;high=len-1;
                
                while(low<high){
                int sum=nums[i]+nums[j]+nums[low]+nums[high];
                if(sum==target){
                    list.add(Arrays.asList(nums[i],nums[j],nums[low],nums[high]));
                    low++;high--;
                    while(low<high&&nums[low]==nums[low-1])low++;
                    while(low<high&&nums[high]==nums[high+1])high--;
                }
                else if(sum<target)low++;
                else high--;
                }
            }
        }
        return list;
    }
}

题目五:
给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

import java.lang.*;
class Solution {
    public int longestConsecutive(int[] nums) {
        Map<Integer,Integer> map=new HashMap<>();
        int len=nums.length;
        int num;//记录此位置的长序列长度
        int left,right,longest=0;
        for(int i=0;i<len;i++){
            if(!map.containsKey(nums[i])){
            left=map.containsKey(nums[i]-1)==false?0:map.get(nums[i]-1);
            right=map.containsKey(nums[i]+1)==false?0:map.get(nums[i]+1);
            num=left+right+1;
            longest=Math.max(num,longest);
            map.put(nums[i],num);
            map.put(nums[i]-left,num);
            map.put(nums[i]+right,num);
            }
        }
        return longest;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值