牛客刷题——剑指offer(第四期)

简介: 牛客刷题——剑指offer(第四期)

里面有非常多的题库 跟面经知识 真的非常良心了!!

JZ49 丑数🥚

jz丑数

题目描述🥚

f03428550f7f44b1bced1be82d1559ab.png

解题思路🥚

根据题意可知 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。


我们可以定义一个数组 dp 用来存储 丑数的个数

题目要求从小到大排列丑数

最小的丑数是1 所以dp[0]=1

丑数的形式 通用公式就是2x3y5z


所以我们就将res[n]去乘以 2、3、5,然后比较出最小的那个,就是我们当前的下一个丑数了。


代码详解🥚

import java.util.*;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
    if(index<=6){
        return index; //特判前6个丑数
    }
        int i2=0,i3=0,i5=0; //定义三个变量 分别是包含质因子 2,3,5 乘的次数
        int dp[]=new int[index];
        dp[0]=1;
        for(int i=1;i<index;i++){
            dp[i]=Math.min(dp[i2]*2,Math.min(dp[i3]*3,dp[i5]*5));
            //第一次是 2 ,3, 5  比较得到最小值是2
            if(dp[i]==dp[i2]*2) i2++;
            if(dp[i]==dp[i3]*3) i3++;
            if(dp[i]==dp[i5]*5) i5++;
        }
        return dp[index-1]; .//返回第n个
    }
}


JZ29 顺时针打印矩阵🥚

JZ29顺时打印矩阵

题目描述🥚

ca274b64f87b45819c1fcd28c078b791.png


解题思路🥚

这道题正常模拟即可

注意边界问题

左右 边界 跟上下边界重合的时候

往右到底后再往下到底后再往左到底后再往上,结束这一圈,进入下一圈螺旋。

每次走完一步 都要判断 上下 边界 或者左右边界是否重合

代码详解🥚

import java.util.*;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> res=new ArrayList<>();
        if( matrix.length==0){
            return res;
        }
        int left=0; //左边界
        int right=matrix[0].length-1; //右边界
        int up=0; //上边界
        int down=matrix.length-1; //下边界
        while(left<=right&&up<=down){
            //第一行从左到右进行遍历
            for(int i=left;i<=right;i++)
                res.add(matrix[up][i]);
            up++;
            if(up>down)  //如果上边界大于下边界就跳出循环
                 break;
            //右边界从上到下
            for(int i=up;i<=down;i++)
                res.add(matrix[i][right]);
            //右边界向左
                right--;
                if(left>right)
                    break;
            for(int i=right;i>=left;i--)
                res.add(matrix[down][i]);
                down--;
                if(up>down)
                    break;
                //左边界往上
            for(int i=down;i>=up;i--)
                res.add(matrix[i][left]);
                left++;
                if(left>right)
                    break;
        }
           return res;
    }
}




相关文章
|
4月前
|
容器
《剑指offer》——刷题日记
《剑指offer》——刷题日记
|
4月前
|
算法 索引
力扣刷题【第一期】
这是一个关于算法的总结,包含7个不同的问题。1)爬楼梯问题,使用动态规划,通过迭代找到到达n阶楼梯的不同方法数。2)两数之和,通过双重循环找出数组中和为目标值的两个数的索引。3)移动零,使用双指针将数组中的0移到末尾。4)合并有序链表,创建新链表按升序合并两个链表。5)删除链表重复值,遍历链表删除重复元素。6)环形链表检测,使用快慢指针判断链表是否有环。7)相交链表,计算链表长度找
35 1
|
4月前
|
人工智能 BI
牛客小白月赛66
牛客小白月赛66
34 0
|
算法 JavaScript 容器
牛客网《剑指offer》专栏刷题练习之数组专精
牛客网《剑指offer》专栏刷题练习之数组专精
83 0