给出一个整数数组 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;
}
}