面试必学!!

前言

壁纸推荐

图片著作小圣anx:https://bcy.net/item/detail/6885930410862189571?_source_page=cos
在这里插入图片描述

如有涉权,请联系我立删

博主简介

博主介绍:

– 本人是了凡,意义是希望本人任何时候以善良为先,以人品为重,喜欢了凡四训中的立命之学、改过之法、积善之方、谦德之效四训,更喜欢每日在简书上投稿日更的读书感悟笔名:三月_刘超。专注于 Go Web 后端,辅学Python、Java、算法、前端等领域。未来大家一起加油啊~


题目A:简单

题目:移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

示例 1:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

题解:

思路:双指针解法

public class A{
    
    
    public void moveZeroes(int[] nums) {
    
    
        int l = 0, r = 0;
        while (r < nums.length) {
    
    
            if (nums[r] != 0) {
    
    
                int t = nums[l];
                nums[l] = nums[r];
                nums[r] = t;
                l++;
            }
            r++;
        }
    }
}


题目B:中等

题目:盛最多水的容器

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。

示例:

示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:
输入:height = [1,1]
输出:1

示例 3:
输入:height = [4,3,2,1,4]
输出:16

示例 4:
输入:height = [1,2,1]
输出:2

题解:

思路:双指针写法

class B{
    
    
    public int maxArea(int[] height) {
    
    
        int max = 0;
        for(int i = 0, j = height.length - 1; i < j;){
    
    
            int minHeight = height[i] < height[j] ? height[i ++] : height[j --];
            int are = (j - i + 1) * minHeight;
            max = Math.max(max, are);
        }
        return max;
    }
}

题目C:困难

题目:柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
在这里插入图片描述

示例:

示例 1:
输入: [2,1,5,6,2,3]
输出: 10

题解:

class Solution {
    
    
    public int largestRectangleArea(int[] heights) {
    
    
        int n = heights.length;
        int[] left = new int[n];
        int[] right = new int[n];
        
        Stack<Integer> mono_stack = new Stack<Integer>();
        for (int i = 0; i < n; ++i) {
    
    
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {
    
    
                mono_stack.pop();
            }
            left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek());
            mono_stack.push(i);
        }

        mono_stack.clear();
        for (int i = n - 1; i >= 0; --i) {
    
    
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {
    
    
                mono_stack.pop();
            }
            right[i] = (mono_stack.isEmpty() ? n : mono_stack.peek());
            mono_stack.push(i);
        }
        
        int ans = 0;
        for (int i = 0; i < n; ++i) {
    
    
            ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);
        }
        return ans;
    }

后序每周持续更新!

猜你喜欢

转载自blog.csdn.net/weixin_45765795/article/details/117887143