给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
/**
* 输入: nums = [1,3,5,6], target = 5
* 输出: 2
*
* 输入: nums = [1,3,5,6], target = 2
* 输出: 1
*/
public static int searchInsert(int[] nums, int target){
for (int i = 0; i < nums.length; i++) {
if(nums[i] == target){
return i;
}
}
for (int i = 0; i < nums.length; i++) {
if(nums[i] < target){
if(i < nums.length - 1 && nums[i+1] > target){
return i+1;
}
if(nums[nums.length - 1] <target){
return nums.length;
}
}else if(nums[0] > target){
return 0;
}
}
return -1;
}
题意为寻找一个目标值,此类问题都可以使用二分查找。
public static int searchInsert2(int[] nums, int target){
int n = nums.length;
int left = 0;
int right = n - 1;
int index = n;
while (left <= right){
int mid = left + (right - left)/2;
if (target <= nums[mid]) {
index = mid;
right = mid - 1;
}else{
left = mid + 1;
}
}
return index;
}
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
public static boolean isIsomorphic(String s, String t) {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
//第一个字符串当前字符
String sc = String.valueOf(s.charAt(i));
//第二个字符串当前字符
String tc = String.valueOf(t.charAt(i));
//如果第一个map包含此字符,判断第二个字符串当前位置值是否等于map的value,不等返回false
if (map.containsKey(sc)){
if(!map.get(sc).equals(tc)){
return false;
}
}else{//如果不包含
//此时也不应该存在值为tc的key
if(map.containsValue(tc)){
return false;
}
//放入map
map.put(sc, tc);
}
}
return true;
}
public static boolean isIsomorphic(String s, String t) {
Map<Character, Character> map1 = new HashMap<Character, Character>();
Map<Character, Character> map2 = new HashMap<Character, Character>();
for (int i = 0; i < s.length(); i++) {
//第一个字符串当前字符
char sc = s.charAt(i);
//第二个字符串当前字符
char tc = t.charAt(i);
//如果map1包含,则值必须等于tc,,,,,如果map2包含此值,则此值必须等于sc,,否则报错
if (map1.containsKey(sc) && map1.get(sc)!=tc || map2.containsKey(tc) && map2.get(tc)!=sc){
return false;
}
map1.put(sc,tc);
map2.put(tc,sc);
}
return true;
}
唯一的不足就是Character的问题,,,谨记,谨记。
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
public boolean containsDuplicate(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if(list.contains(nums[i])){
return true;
}
list.add(nums[i]);
}
return false;
}
提示超出时间限制!
public static boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int n : nums) {
if (!set.add(n)) {
return true;
}
}
return false;
}
Set检索元素效率低下,删除和插入效率高;List查找元素效率高,插入删除元素效率低。
使用contains方法查询元素是否存在HashSet要比ArrayList快的多。