力扣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
;
}
}
写在最后
冲!
转载请注明原文地址:https://blackberry.8miu.com/read-46522.html