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的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode算法,每日一题,冲击阿里巴巴,day5

算法·每日一题(详解+多解)-- day14

算法·每日一题(详解+多解)-- day14

Leetcode每日一题(3)

leetcode每日leetcode一题

leetcode每日leetcode一题