不到万不得已不使用暴力破解法
水平有限,仅供自己熟悉算法使用。
1 两数之和
误区:将数组排序,比较a[0] + a[n] 和 target大小,此时可以找到这样的两个元素,但是由于排序导致了元素下标的改变。
正解:使用HashMap,先将数据存储到hashmap中,然后遍历。
public int[] twoSum(int[] nums, int target) {
//注意key和value的值
Map<Integer,Integer> map = new HashMap();
for(int i=0;i<nums.length;i++) {
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++) {
int res = target - nums[i];
if(map.containsKey(res) && map.get(res) != i) {
return new int[]{i,map.get(res)};
}
}
throw new IllegalArgumentException("No two sum solution");
}
20. 有效的括号
分析:对于括号的匹配问题应该用栈来处理,遇到左边入栈,遇到右边出栈并判断是不是对应的括号,处理过程中需判断栈是否为空,此外需要注意输入字符串为空情况。
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char ch = s.charAt(i);
if (stack.empty()) {
stack.push(ch);
} else if((stack.peek() == '(' && ch == ')') || (stack.peek() == '[' && ch == ']') || (stack.peek() == '{' && ch == '}')) {
stack.pop();
} else {
stack.push(ch);
}
}
return stack.size()==0;
}