1、202. 快乐数
如上题所述:
在该题意规则下,所有的数字变化会有两种情况,其一最后是有的会变化成恒为1的数;其二是有的数会变化会呈现成有规律的环,分别如下图所示:
可以近似的理解为图一就是一个环,只不过该环的数字都为一;
故此解题思路如下所示:
本题采用快慢指针,快满指针终究会在环里面相遇,当相遇到的数的数值不为一,则该数不是快乐数,反之则该数为快乐数,代码如下;
class Solution {
public int squsum(int n){
int sum = 0;
while(n != 0){
int temp = n % 10;
sum += temp * temp;
n = n / 10;
}
return sum;
}
public boolean isHappy(int n) {
int slow = n,fast = squsum(n);
while(slow != fast){
slow = squsum(slow);
fast = squsum(squsum(fast));
}
if(fast == 1){
return true;
}else{
return false;
}
}
}
2、11. 盛最多水的容器
有上述题意所述,采用左右双指针和单调性的规律解题:
1、定义左右双指针,从最左边和最右边取其中最小的值与指针之间的宽度进行计算其容积并记录在案;
2、有单调性规律可知,选择指针所指数据小的指针移动,并重复第一步,最后比较两次的容积,取最大值;
3、重复上述两个步骤,当左右指针重合时,该循环结束;
代码如下:
class Solution {
public int maxArea(int[] height) {
int left = 0,right = height.length-1,res = 0;
while(left < right){
int res1 = Math.min(height[left],height[right]) * (right - left);
res = Math.max(res,res1);
if(height[left] < height[right]){
left ++;
}else{
right --;
}
}
return res;
}
}
3、611. 有效三角形的个数
判断三角形的简化准则:最小的两数之和大于最大的一数,则三者可以构成一个三角形;
此题我们使用前后双指针和单调性的规律来解题,算法步骤如下:
步骤一:将数组从小到大序列化;
步骤二:首先固定最右边的最大数;
如下图所示,找到当前的左右指针,计算指针所指两数之和是否大于固定的最大值;
情况一:当前的左右指针,计算指针所指两数之和是大于固定的最大值
由于左数+右数>max;所以有单调性可知,(1,14)范围之内的所有数+右数大于max,故此此时可以构成三角形的个数有right-left个,之后right左移;
情况二:当前的左右指针,计算指针所指两数之和是小于固定的最大值
由于单调性可知,left右移一个,从而进行新的判断;
步骤三:重复一二步骤的操作,知道max最大值小于到2位置时,循环结束;
代码如下:
class Solution {
public int triangleNumber(int[] nums) {
Arrays.sort(nums);
int res = 0, n = nums.length;
for(int max = n-1;max >= 2; max --){
int left = 0,right = max - 1;
while(left < right){
if(nums[left] + nums[right] > nums[max]){
res += right - left;
right --;
}else{
left ++;
}
}
}
return res;
}
}
ps:本次的内容就到这里了,如果大家感兴趣话,就请一键三连哦!!!