asp.net 网站计数器广州深圳做网站
web/
2025/10/6 7:24:44/
文章来源:
asp.net 网站计数器,广州深圳做网站,海外网站空间,网络培训课堂app1每日温度
给定一个整数数组 temperatures #xff0c;表示每天的温度#xff0c;返回一个数组 answer #xff0c;其中 answer[i] 是指对于第 i 天#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高#xff0c;请在该位置用 0 来代替。 示例 1:
输入…1每日温度
给定一个整数数组 temperatures 表示每天的温度返回一个数组 answer 其中 answer[i] 是指对于第 i 天下一个更高温度出现在几天后。如果气温在这之后都不会升高请在该位置用 0 来代替。 示例 1:
输入: temperatures [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]示例 2:
输入: temperatures [30,40,50,60]
输出: [1,1,1,0]示例 3:
输入: temperatures [30,60,90]
输出: [1,1,0] 提示
1 temperatures.length 10530 temperatures[i] 100
思路
1暴力解法的思路是使用两层循环来遍历每个温度并在内层循环中查找下一个更高温度的位置。具体来说外层循环遍历每个温度内层循环从当前温度的下一个温度开始遍历直到找到一个比当前温度高的温度位置然后计算这两个位置的距离并将结果存储起来。
对于每个温度 temperatures[i]都需要找到下一个比它高的温度的位置。使用两层循环外层循环遍历每个温度 temperatures[i]内层循环从 i 1 开始遍历到数组末尾寻找第一个比 temperatures[i] 高的温度。如果找到了比 temperatures[i] 高的温度就计算这两个位置的距离即 j - i其中 j 是内层循环找到的更高温度的位置。将计算得到的距离存储到结果数组中。
代码
class Solution {
public:vectorint dailyTemperatures(vectorint temperatures) {int n temperatures.size();vectorint ans(n), next(101, INT_MAX); // 存储结果数组和温度下一次出现位置的数组初始值设为INT_MAXfor (int i n - 1; i 0; --i) { // 从后往前遍历温度数组int warmerIndex INT_MAX; // 初始化温度升高的位置为INT_MAXfor (int t temperatures[i] 1; t 100; t) { // 从当前温度的下一个温度开始循环warmerIndex min(warmerIndex, next[t]); // 找到下一个更高温度的位置}if (warmerIndex ! INT_MAX) { // 如果找到了更高温度的位置ans[i] warmerIndex - i; // 计算与下一个更高温度的位置的距离}next[temperatures[i]] i; // 更新当前温度下一次出现的位置}return ans; // 返回结果数组}
};
2单调栈的思路
单调栈的思路是利用栈的特性在遍历数组时维护一个单调递减或递增的栈。对于每个元素如果栈为空或者当前元素小于等于栈顶元素则将当前元素的索引入栈如果当前元素大于栈顶元素则说明找到了栈顶元素的下一个更大或更小的元素此时可以进行相应的操作如计算距离并更新结果数组。通过这样的方式可以在一次遍历中解决问题时间复杂度为O(n)
这道题使用单调栈的思路可以很好地解决。具体来说我们可以遍历每个温度维护一个单调递减的栈栈中存储的是温度的索引。当遍历到一个温度时如果栈为空或者当前温度小于等于栈顶温度对应的温度那么将当前温度的索引入栈如果当前温度大于栈顶温度对应的温度说明找到了栈顶温度的下一个更高温度此时可以计算距离并更新结果数组。通过维护这样一个单调递减的栈在一次遍历中就可以解决该问题.
代码 class Solution {
public:vectorint dailyTemperatures(vectorint T) {// 递增栈存储温度的索引stackint st;// 用于存储结果的数组初始化为0vectorint result(T.size(), 0);// 遍历每个温度for (int i 0; i T.size(); i) {// 如果当前栈为空或者当前温度小于等于栈顶温度if (st.empty() || T[i] T[st.top()]) {st.push(i); // 将当前温度的索引入栈} else { // 当前温度大于栈顶温度// 循环处理栈中温度小于当前温度的情况while (!st.empty() T[i] T[st.top()]) {// 计算当前温度与栈顶温度的距离并更新结果数组result[st.top()] i - st.top();st.pop(); // 弹出栈顶元素}st.push(i); // 将当前温度的索引入栈}}return result;}
};
2目标和
给你一个非负整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 或 - 然后串联起所有整数可以构造一个 表达式
例如nums [2, 1] 可以在 2 之前添加 在 1 之前添加 - 然后串联起来得到表达式 2-1 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。 示例 1
输入nums [1,1,1,1,1], target 3
输出5
解释一共有 5 种方法让最终目标和为 3 。
-1 1 1 1 1 3
1 - 1 1 1 1 3
1 1 - 1 1 1 3
1 1 1 - 1 1 3
1 1 1 1 - 1 3示例 2
输入nums [1], target 1
输出1
动态规划思路
假设加法的总和为x那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) target
x (target sum) / 2
此时问题就转化为装满容量为x的背包有几种方法。
这里的x就是bagSize也就是我们后面要求的背包容量。
动态规划五部曲
确定dp数组以及下标的含义
dp[j] 表示填满j包括j这么大容积的包有dp[j]种方法 2 确定递推公式
有哪些来源可以推出dp[j]呢
只要搞到nums[i]凑成dp[j]就有dp[j - nums[i]] 种方法。
例如dp[j]j 为5
已经有一个1nums[i] 的话有 dp[4]种方法 凑成 容量为5的背包。已经有一个2nums[i] 的话有 dp[3]种方法 凑成 容量为5的背包。已经有一个3nums[i] 的话有 dp[2]中方法 凑成 容量为5的背包已经有一个4nums[i] 的话有 dp[1]中方法 凑成 容量为5的背包已经有一个5 nums[i]的话有 dp[0]中方法 凑成 容量为5的背包
那么凑整dp[5]有多少方法呢也就是把 所有的 dp[j - nums[i]] 累加起来。
所以求组合类问题的公式都是类似这种
dp[j] dp[j - nums[i]] 3 dp数组如何初始化
从递推公式可以看出在初始化的时候dp[0] 一定要初始化为1因为dp[0]是在公式中一切递推结果的起源如果dp[0]是0的话递推结果将都是0。
如果数组[0] target 0那么 bagSize (target sum) / 2 0。 dp[0]也应该是1 也就是说给数组里的元素 0 前面无论放加法还是减法都是 1 种方法。
所以本题我们应该初始化 dp[0] 为 1。
4 确定遍历顺序
nums放在外循环target在内循环且内循环倒序。
5 举例推导dp数组
输入nums: [1, 1, 1, 1, 1], S: 3
bagSize (S sum) / 2 (3 5) / 2 4
代码
class Solution {
public:int findTargetSumWays(vectorint nums, int S) {int sum 0;for (int i 0; i nums.size(); i) sum nums[i];if (abs(S) sum) return 0; // 当目标和的绝对值大于数组总和时没有方案if ((S sum) % 2 1) return 0; // 当目标和与数组总和的差为奇数时没有方案int bagSize (S sum) / 2; // 目标和与数组总和之差的一半为背包容量vectorint dp(bagSize 1, 0); // 动态规划数组表示在当前容量下的方案数dp[0] 1; // 初始化容量为0时有一种方案for (int i 0; i nums.size(); i) { // 遍历数组中的每个数for (int j bagSize; j nums[i]; j--) { // 从大到小更新当前容量下的方案数dp[j] dp[j - nums[i]]; // 更新方案数当前容量的方案数等于当前容量减去当前数的方案数之和}}return dp[bagSize]; // 返回目标容量下的方案数}
};
3 有趣的电影
表cinema
--------------------------
| Column Name | Type |
--------------------------
| id | int |
| movie | varchar |
| description | varchar |
| rating | float |
--------------------------
id 是该表的主键(具有唯一值的列)。
每行包含有关电影名称、类型和评级的信息。
评级为 [0,10] 范围内的小数点后 2 位浮点数。编写解决方案找出所有影片描述为 非 boring (不无聊) 的并且 id 为奇数 的影片。
返回结果按 rating 降序排列。
结果格式如下示例。 示例 1
输入
---------------------------------------------
| id | movie | description | rating |
---------------------------------------------
| 1 | War | great 3D | 8.9 |
| 2 | Science | fiction | 8.5 |
| 3 | irish | boring | 6.2 |
| 4 | Ice song | Fantacy | 8.6 |
| 5 | House card| Interesting| 9.1 |
---------------------------------------------
输出
---------------------------------------------
| id | movie | description | rating |
---------------------------------------------
| 5 | House card| Interesting| 9.1 |
| 1 | War | great 3D | 8.9 |
---------------------------------------------
解释
我们有三部电影它们的 id 是奇数:1、3 和 5。id 3 的电影是 boring 的所以我们不把它包括在答案中。
思路我们可以使用 mod(id,2)1 来确定奇数 id然后添加 description ! boring 来解决问题。
MOD() 函数是用来计算两个数相除后的余数。在 SQL 中MOD() 函数通常使用以下语法
MOD(dividend, divisor)其中dividend 是被除数divisor 是除数。该函数返回 dividend 除以 divisor 后的余数。
例如MOD(10, 3) 将返回 1因为 10 除以 3 后余数为 1。
代码
select id,movie,description,rating
from cinema
where description ! boring and mod(id,2) 1
order by rating desc; 4 换座位
表: Seat
----------------------
| Column Name | Type |
----------------------
| id | int |
| student | varchar |
----------------------
id 是该表的主键唯一值列。
该表的每一行都表示学生的姓名和 ID。
id 是一个连续的增量。编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数则最后一个学生的id不交换。
按 id 升序 返回结果表。
查询结果格式如下所示。 示例 1:
输入:
Seat 表:
-------------
| id | student |
-------------
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
-------------
输出:
-------------
| id | student |
-------------
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
-------------
解释:
请注意如果学生人数为奇数则不需要更换最后一名学生的座位
思路case 语句检查每一行 a. 如果 ID 是奇数且等于表中的最大 ID这意味着它是最后一个学生并且学生总数是奇数则保持 ID 不变。 b. 如果 ID 是奇数并且不是奇数总学生的最后一个学生则将 ID 增加 1。 c. 如果 ID 是偶数则将 ID 减少 1。 d. order by 子句确保结果按修改后的 id 升序排列。 代码
select
#如果id为奇数且为最大id则保持不变
case when id % 2 1 and id (select max(id) from seat) then id
#如果id为奇数则加1when id % 2 1 then id 1
#如果id为偶数则减1else id - 1
end as id,
student
#从seat表中按id顺序检索学生信息
from seat
order by id;
5变更性别
Salary 表
-----------------------
| Column Name | Type |
-----------------------
| id | int |
| name | varchar |
| sex | ENUM |
| salary | int |
-----------------------
id 是这个表的主键具有唯一值的列。
sex 这一列的值是 ENUM 类型只能从 (m, f) 中取。
本表包含公司雇员的信息。请你编写一个解决方案来交换所有的 f 和 m 即将所有 f 变为 m 反之亦然仅使用 单个 update 语句 且不产生中间临时表。
注意你必须仅使用一条 update 语句且 不能 使用 select 语句。
结果如下例所示。 示例 1:
输入
Salary 表
-----------------------
| id | name | sex | salary |
-----------------------
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
-----------------------
输出
-----------------------
| id | name | sex | salary |
-----------------------
| 1 | A | f | 2500 |
| 2 | B | m | 1500 |
| 3 | C | f | 5500 |
| 4 | D | m | 500 |
-----------------------
解释
(1, A) 和 (3, C) 从 m 变为 f 。
(2, B) 和 (4, D) 从 f 变为 m 。
思路 具体思路就是利用 SQL 的 case when 语句进行条件判断和更新操作。首先我们使用 case when条件来判断每条记录中的性别字段。如果性别为 ‘m’则将其更新为 ‘f’如果性别为其他值假设只有 ‘m’ 和 ‘f’ 两种可能性则将其更新为 ‘m’。这样就完成了性别的更新操作。
代码
update salary
set sex (case sexwhen m then f #如果性别为男性则改为女性else m #否则改为男性end);
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87803.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!