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快的多。

关注公众号:哪吒编程

哪吒编程每周更新优质文章,关注后回复【CSDN】领取Java思维导图、Java学习资料、海量面试资料。

加我微信:18525351592

拉你进入技术交流群,群内有很多技术大佬,一起交流技术,一起进阶,一起进大厂,还可白嫖技术书籍~~

猜你喜欢

转载自blog.csdn.net/guorui_java/article/details/123222072