20201008:力扣209周周赛题解(下)

    科技2026-08-07  20

    力扣209周周赛题解(下)

    题目思路与算法代码实现写在最后

    题目

    可见点的最大数目 使整数变为 0 的最少操作次数

    思路与算法

    第一题注意添加角度时atan2的范围是正负π,因此注意差值可能超出这个范围,因此将计算出的角度+2π再次存入即可避免这个错误。第二题格雷码逆处理过程,不再赘述,见代码

    代码实现

    可见点的最大数目 class Solution { public int visiblePoints(List<List<Integer>> points, int angle, List<Integer> location) { int pointCnt = points.size(); List<Double> angles = new ArrayList<>(); int extraAns = 0; for (int i = 0; i < pointCnt; i++) { int deltaY = points.get(i).get(1) - location.get(1); int deltaX = points.get(i).get(0) - location.get(0); if (deltaX == 0 && deltaY == 0){ extraAns++; continue; } double curAngle = Math.atan2(deltaY,deltaX); angles.add(curAngle); angles.add(curAngle + 2 * Math.PI); } Collections.sort(angles); int ans = 0; int left = 0; int right = 0; double maxAngle = angle * Math.PI / 180.0; while (true) { if (right == angles.size()) { return ans + extraAns; } if (angles.get(right) - angles.get(left) <= maxAngle) { ans = Math.max(ans, right - left + 1); right++; } else { left++; } } } } 使整数变为 0 的最少操作次数 class Solution { public int minimumOneBitOperations(int n) { int ans = 0; while (n != 0) { ans ^= n; n >>= 1; } return ans; } }

    写在最后

    冲!

    Processed: 0.010, SQL: 9