1.两数和问题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
提示:
只会存在一个有效答案
解法1:暴力求解(一个嵌套for循环搞定)
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
暴力解法时间复杂度为O(N^2),空间复杂度为O(1)
解法2:利用hash表求解
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};
}else{
map.put(nums[i],i);
}
}
return new int[0];
}
}
解法2的时间复杂度为O(N),空间复杂度为O(N)
2.整数反转问题
给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
解题思路:
一种是先将int转成String,然后反向遍历一下形成一个新的String然后再转为long,判断是否越界,如果越界则返回0,没有越界则直接转成int。但是这种比第一题的暴力求解还low。
第二种解法也相对简单,我们可以通过每次对10取模得到末尾的数字,然后又将得到的数字乘以10,即可得到最终的结果,当然也需要判断是否超过范围。
以下为官方解法:
class Solution {
public int reverse(int x) {
int rev=0;
while(x!=0){
int pop=x%10;
x/=10;
if(rev>Integer.MAX_VALUE/10||(rev==Integer.MAX_VALUE/10&&pop>7))return 0;
if(rev<Integer.MIN_VALUE/10||(rev==Integer.MIN_VALUE/10&&pop<-8)) return 0;
rev=rev*10+pop;
}
return rev;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
网友评论