LeetCode算法,每日一题,冲击阿里巴巴,day5
Posted 哪 吒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode算法,每日一题,冲击阿里巴巴,day5相关的知识,希望对你有一定的参考价值。
1、LeetCode 35.搜索插入位置
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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;
2、LeetCode 205.同构字符串
题目
给定两个字符串 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的问题,,,谨记,谨记。
3、LeetCode 217.存在重复元素
题目
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 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快的多。
以上是关于LeetCode算法,每日一题,冲击阿里巴巴,day5的主要内容,如果未能解决你的问题,请参考以下文章