很久没刷过算法题目了
今天第一次再去进行算法练习
熟悉Java语法
其实这道题没写出来,看了几眼,感觉不会写Java语法了
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++)
}
}
}
这是第一遍
发现其实有不少错误的
接下来第二遍
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target)
return '['+i+','+']';
}
}
}
}
这是第二遍
还是有问题的
这样虽然也对了,但是这个其实有其它方式
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target)
return new int[]{i,j};
}
}
throw new IllegalArgumentException("没有找到");
}
}
这是最终版
这里面要用到异常
熟悉异常的过程
那么继续
后面的改进版呢?
进阶版本
怎么样达到时间复杂度小于O(n^2)呢
这实际上是一个什么过程呢
首先是查找
哦豁
想到一个很漂亮的思路
利用储存
内存换时间的方法
其实之前有做过这类题目
那么来吧
思路如下:i,把数组里面所有i存到hashmap里面
然后下次遍历数组的情况下如果有target-i那么就说明有,返回下标即可
下面是代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> hashmap=new HashMap<>();
for(int i=0;i<=nums.length;i++){
int element = target - nums[i];
if(hashmap.containsKey(element))
{
return new int[] {i,hashmap.get(element)};
}
hashmap.put(nums[i],i);
}
throw new IllegalArgumentException("没有找到");
}
}
这道题就到这了