题目 给你一个数组 nums ,请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right 实现 NumArray 类: NumArray(int[] nums) 用整数数组 nums 初始化对象 void update(int index, int val) 将 nums[index] 的值 更新 为 val int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 (即,nums[left] + nums[left + 1], ..., nums[right]) 示例 1: 输入: ["NumArray", "sumRange", "update", "sumRange"] [[[1, 3, 5]], [0, 2], [1, 2],
题目 给你一个正方形字符数组 board ,你从数组最右下方的字符 'S' 出发。 你的目标是到达数组最左上角的字符 'E' ,数组剩余的部分为数字字符 1, 2, ..., 9 或者障碍 'X'。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。 一条路径的 「得分」 定义为:路径上所有数字的和。 请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。 如果没有任何路径可以到达终点,请返回 [0, 0] 。 示例 1: 输入:board = ["E23","2X2","12S"] 输出:[7,1] 示例 2: 输入:board = ["E12","1X1","21S"] 输出:[4,2] 示例 3: 输入:board = ["E11","XXX","11S"] 输出:[0,0] 提示: 2 <= board.length == board[i].length <= 100 思路 定义dp[i][j]表示位置(i,j)的最大得分,则dp[i][j]=max
题目 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] = [lefti, righti, heighti] 表示: lefti 是第 i 座建筑物左边缘的 x 坐标。 righti 是第 i 座建筑物右边缘的 x 坐标。 heighti 是第 i 座建筑物的高度。 你可以假设所有的建筑都是完美的长方形,在高度为 0 的绝对平坦的表面上。 天际线 应该表示为由 “关键点” 组成的列表,格式 [[x1,y1],[x2,y2],...] ,并按 x 坐标 进行 排序 。关键点是水平线段的左端点。列表中最后一个点是最右侧建筑物的终点,y 坐标始终为 0 ,仅用于标记天际线的终点。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。 注意:输出天际线中不得有连续的相同高度的水平线。例如 [...[2 3], [4 5], [7 5], [11 5], [12 7]...] 是不正确的答案;三条高度为 5 的
题目 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = "11", b = "1" 输出:"100" 示例 2: 输入:a = "1010", b = "1011" 输出:"10101" ``` 提示: 1 <= a.length, b.length <= 104 a 和 b 仅由字符 '0' 或 '1' 组成 字符串如果不是 "0" ,就不含前导零 ###思路 本题很直观就是直接模拟,从右往左,一位一位的加。 ###代码 class Solution { public: string addBinary(string a, string b) { int carry = 0; int m = a.length(); int n = b.length(); int ansLen = max(m,n)+1; string ans(ansLen,'0'); while(m>0||n>0) { int tmp = 0; if(m>0&&n>0) { tmp = (a[-
位元算基本介绍 位运算包括左移、右移、与、或、异或、否。在c/c++种的符号分别是<<、>>、&、|、^、~。 <<(左移):5101左移一位变成101010,效果是52。a<<b的效果是a\2b。 >>(右移):5101右移一位变成210,效果是5/2。a>>b的效果是a/2b。 &(与):1和1才是1,其他情况(0和1,1和0,0和0)都是0。 |(或):0和0才是0,其他情况(0和1,1和0,1和1)都是1。 ^(异或):相同(0和0,1和1)为0,不同(1和0,0和1)为1。也被称为不进位的加法,即半加运算。 ~(否):按位取反,即0变成1,1变成0。 技巧 1 << n,表示2n n & 1,表示n的最右位数字,所以n >> i & 1表示n的第i位数字,i为从0开始,从右往左数的结果, a^a=0,a^0=a,a^b^c=(a^b)^c=a^(b^c)=a^c^b |运算常用来拼接两个数,比如1000和100,拼接结果为1100