当前位置: 美高梅棋牌 > 智能家电 > 正文

LeetCode算法题-Heaters(Java实现)

时间:2019-10-03 06:34来源:智能家电
这是悦乐书的第 240 次更新,第 253 篇原创 这是悦乐书的第 239 次更新,第 252 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题。给定正整数,输出其补码数。补充策

这是悦乐书的第240次更新,第253篇原创

这是悦乐书的第239次更新,第252篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第107题。给定正整数,输出其补码数。补充策略是翻转其二进制表示的位。例如:

输入:5输出:2说明:5的二进制表示为101,其补码为010,因此需要输出2。

输入:1输出:0说明:1的二进制表示形式为1,其补码为0,因此需要输出0。

注意:

  • 保证给定的整数适合32位有符号整数的范围。

  • 您可以假设整数的二进制表示中没有前导零位。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第106题。冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径的标准加热器,以加热所有房屋。现在,您可以在水平线上获得房屋和加热器的位置,找出加热器的最小半径,以便所有房屋都能被这些加热器覆盖。因此,您的输入将分别是房屋和加热器的位置,您的预期输出将是加热器的最小半径。例如:

输入:[1,2,3],[2]输出:1说明:唯一的加热器在位置2,如果我们使用半径1标准,那么所有房屋都可以加热。

输入:[1,2,3,4],[1,4]输出:1说明:两个加热器在位置1和4,我们需要使用半径1标准,然后所有房屋都可以加热。

注意:

  • 您给出的房屋和加热器的数量是非负数,不会超过25000。

  • 您给出的房屋和加热器的位置是非负的,不会超过10 ^ 9。

  • 只要房子在加热器的温暖半径范围内,就可以加热。

  • 所有加热器都遵循半径标准,温暖半径也是如此。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

先将正整数转为二进制字符串,然后变成字符数组,将其中的0变成1,1变成0,再将字符数组变为字符串,最后将字符串转为二进制数。

public int findComplement { String str = Integer.toBinaryString; char[] arr = str.toCharArray(); for (int i=0; i<arr.length; i++) { if (arr[i] == '0') { arr[i] = '1'; } else { arr[i] = '0'; } } return Integer.parseInt(String.valueOf;}

02 第一种解法

我们将房子、加热器都先排序,然后利用两层循环,外层遍历房子,内层遍历加热器,每次获取到房子,就去比较对应位置的左右加热器,拿他们的位置值与当前房子的位置值之间的绝对值做比较,如果右边的加热器的位置值绝对值小于左边的,就继续向右比较,也就是取当前房子在左右加热器之间的最小半径。然后将当前的最小半径和上一次比较获得的最小半径取最大值,因为要覆盖所有的房子。

public int findRadius(int[] houses, int[] heaters) { if (houses == null || heaters == null) { return 0; } int result = Integer.MIN_VALUE; Arrays.sort; Arrays.sort; int i = 0, j = 0; while (i < houses.length) { while (j < heaters.length-1 && Math.abs(heaters[j+1] - houses[i]) <= Math.abs(heaters[j] - houses[i])) { j++; } result = Math.max(result, Math.abs(heaters[j] - houses[i])); i++; } return result;}

03 第二种解法

我们可以仔细观察题目所给的示例:

5表示的二进制数为101,最后的结果是2,所表示的二进制数为10,如果我们将其前导0补齐,就会发现101通过计算后要得到010,那么需要借助怎样的计算呢?

借助位运算,101^111 = 010,我们使用二进制数111和101做异或运算就可以得到最后的结果。

因此,我们需要获取num表示的二进制数长度,来组成一个由1组成新二进制数(长度和num表示的二进制数一致),再将两数做异或运算即可。

异或运算的规则是两边的对应位不同时,取1,否则取0。

public int findComplement2 { String str = Integer.toBinaryString; String str2 = ""; for (int i=0; i<str.length { str2 += "1"; } int res = Integer.parseInt; return num^res;}

03 第二种解法

我们先将加热器排序,然后遍历houses中的元素,我们使用二分法找到当前房子在加热器中的最小半径,即当前位置的房子在对应位置的加热器中,其左右加热器到房子之间的最小值,然后比较所有房子的最小半径,在其中取最大值,即最大值所代表的的半径能够覆盖所有房子。

public int findRadius2(int[] houses, int[] heaters) { if (houses == null || heaters == null) { return 0; } Arrays.sort; int result = Integer.MIN_VALUE; for (int i=0; i<houses.length; i++) { int rad = findOne(houses[i], heaters); result = Math.max(result, rad); } return result;}public int findOne(int house, int[] heaters) { int start = 0, end = heaters.length-1; int left = Integer.MAX_VALUE, right = Integer.MAX_VALUE; while (start <= end) { int mid = (start+end)/2; int heater = heaters[mid]; if (house == heater) { return 0; } else if (house < heater) { right = heater - house; end = mid - 1; } else { left = house - heater; start = mid + 1; } } return Math.min(left, right);}

编辑:智能家电 本文来源:LeetCode算法题-Heaters(Java实现)

关键词: