给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
//时间复杂度O(n) 空间复杂度 O(n)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for( int i=0; i<nums.length;i++){
int n = nums[i];
int m = target-n;
if(map.containsKey(m)){
return new int[]{map.get(m),i};
}
map.put(n,i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
//时间复杂度O(n2) 空间复杂度 O(1)
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arr = new int[2];
for( int i=0; i<nums.length;i++){
for(int j= i+1;j<nums.length;j++){
if(target - nums[i] == nums[j]){
arr[0] = i;
arr[1] = j;
return arr;
}
}
}
return arr;
}
}
二、给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
//时间复杂度:O(n)O(n),索引 jj 将会迭代 nn 次。
//空间复杂度(HashMap):O(min(m, n))O(min(m,n)),与之前的方法相同。
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>(); // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}