}
}
Q10.2 合并排序的数组
public class Solution {
public List<List> groupAnagrams(String[] strs) {
if(strsnull||strs.length0) return null;
HashMap<String,List> map = new HashMap<>();
//遍历所有字符串
for (String str : strs) {
char[] chars = str.toCharArray();
//对每一个字符串进行排序,乱序后再排序后的字符串肯定都是一样的,直接用这个作为Key存入map中
Arrays.sort(chars);
String key = new String(chars);
List list = null;
//取key对应的value
if(!map.containsKey(key)) {
list = new ArrayList<>();
}else {
list = map.get(key);
}
list.add(str);
map.put(key,list);
}
return new ArrayList<>(map.values());
}
}
Q10.3 搜索旋转数组
class Solution {
public int search(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i]==target){
return i;
}
}
return -1;
}
}
Q10.5 稀疏数组搜索
在Java中判断字符串值是否相等用s1,equals(s1)。不要直接用==,被耗了好长时间mmp.
class Solution {
//直接法
// public int findString(String[] words, String s) {
// for(int i =0;i <words.length;i++){
// if(words[i].equals(s)){
// return i;
// }
// }
// return -1;
// }
//二分搜索法
public int findString(String[] words, String s) {
//直接二分搜索
int left = 0;
int right = words.length - 1;
//[left.right)
while(left <= right){
while(left < words.length && words[left].equals("")){
left++;
}
while(right >= 0 && words[right].equals("")){
right–;
}
int mid = left + (right - left) / 2;
while(mid < words.length && words[mid].equals("")){
mid++;
}
if(words[mid].equals(s)){
return mid;
}else if(words[mid].compareTo(s) > 0){
//收缩右边界,锁定左边界
right = mid - 1;
}else if(words[mid].compareTo(s) < 0){
//收缩左边界,锁定右边界
left = mid + 1;
}
}
return -1;
}
}
Q10.9 排序矩阵查找
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) {
return false;
}
int m = matrix.length, n = matrix[0].length, row = 0, col = n - 1;
while (row < m && col >= 0) {
if (matrix[row][col] < target) {
row++;
} else if(matrix[row][col] > target) {
col–;
} else {
return true;
}
}
return false;
}
}