20200503:力扣187周周赛上

力扣187周周赛上

  • 题目
  • 思路与算法
  • 代码实现
  • 复杂度分析

题目

  1. 旅行终点站

20200503:力扣187周周赛上_第1张图片

  1. 是否所有 1 都至少相隔 k 个元素
    20200503:力扣187周周赛上_第2张图片

思路与算法

  1. 第一题我没做出来,说来惭愧,菜的离谱。看大神的题解豁然开朗,这题类似之前做过的数青蛙那道题,果然还是太菜了,因为出发城市和终点城市必然是一条路径的起点和终点。举例子说明:
    A-B-C-D-E
    其中包含的实际path应该是A-B,B-C,C-D,D-E,这四组,我们使用map进行套环即可,将这些城市依次加入map,然后记得出发城市如果在map中没出现过,则+1,但是如果终点城市在map中出现过,则获取其出现的次数-1,把二者反过来也可以。我们以上述A-B-C-D-E为例,写一下过程

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200503145644580.png)
    

终点城市必然只在后面出现,且只出现一次,也就是E,其值为-1,其余的BCD最后一次的值都变为了0,因为在出发城市变为1,在终点城市再次出现时需要-1,因此变为0,只有最后的终点,只出现一次,他的值为-1。据此配合map来写即可。
3. 第二题很简单,找出所有的1,然后比较其索引差值即可。看到有大佬的转化为字符串的做法,自愧不如,神仙思路。把只有1和0的数字转化为字符串,然后用1进行分割,再看分割后的字符串数组中的0的个数,也就是字符串的长度和k作比较,结束。

代码实现

  1. 旅行终点站
class Solution {
    public String destCity(List<List<String>> paths) {
        if (paths == null || paths.size() == 0) {
			return "";
		}
		Map<String, Integer> map = new HashMap<>();
		for (List<String> path : paths) {
			
			map.put(path.get(0), map.getOrDefault(path.get(0), 0) - 1);
			map.put(path.get(1), map.getOrDefault(path.get(1), 0) + 1);
		}
		for (List<String> path : paths) {
			if (map.get(path.get(1)) == 1) {
				return path.get(1);
			}
		}
		 return "";

    }
}
  1. 是否所有 1 都至少相隔 k 个元素
class Solution {
    public boolean kLengthApart(int[] nums, int k) {
        // 将所有的1的索引存入list
		List<Integer> list = new ArrayList<>();

		for (int i = 0; i < nums.length; i++) {
			if (nums[i] == 1) {
				list.add(i);
			}
		}

		// 将数组中的数,也就是这些索引进行双层遍历比对,是否都大于k,大于返回true,否则返回false
		int size = list.size();
		for (int j = size - 1; j > 0; j--) {
            if (list.get(j) - list.get(j - 1) <= k) {
                return false;
            }
        }
		return true;
    }
}

复杂度分析

你可能感兴趣的:(leetcode学习记录篇)