Skip to content

Commit aa88e96

Browse files
authored
Create (位运算、数学问题)896、单调数列
1 parent 7a3035d commit aa88e96

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
如果数组是单调递增或单调递减的,那么它是单调的。
3+
4+
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
5+
6+
当给定的数组 A 是单调数组时返回 true,否则返回 false。
7+
8+
9+
10+
示例 1:
11+
12+
输入:[1,2,2,3]
13+
输出:true
14+
15+
示例 2:
16+
17+
输入:[6,5,4,4]
18+
输出:true
19+
20+
示例 3:
21+
22+
输入:[1,3,2]
23+
输出:false
24+
25+
示例 4:
26+
27+
输入:[1,2,4,5]
28+
输出:true
29+
30+
示例 5:
31+
32+
输入:[1,1,1]
33+
输出:true
34+
35+
36+
37+
提示:
38+
39+
1 <= A.length <= 50000
40+
-100000 <= A[i] <= 100000
41+
*/
42+
43+
bool isMonotonic(int* A, int ASize)
44+
{
45+
bool increase = false;
46+
bool decrease = false;
47+
48+
for(int i = 0; i < ASize-1; ++i)
49+
{
50+
increase |= A[i] < A[i+1];
51+
decrease |= A[i] > A[i+1];
52+
if(increase && decrease)
53+
return false;
54+
}
55+
56+
return true;
57+
}
58+
59+
/*
60+
解题思想:
61+
如果一个数列在遍历过程中,时而递增(只要有一次上升,increase就被置一),
62+
时而递减(只要有一次下降,decrease就被置一),那么这个数列就不是单调的,
63+
所以在遍历过程中,如果出现increase和decrease同时为1的情况,那么就说明
64+
数列不是单调的。
65+
66+
对于A[i]和A[i+1]相等的情况,位与运算则会保持之前的状态,不会改变之前遍历
67+
数组的增减性。
68+
*/
69+
70+
bool isMonotonic(int* A, int ASize)
71+
{
72+
int up=1,down=1;
73+
for(int i=0;i<ASize-1;i++)
74+
{
75+
if(A[i]>=A[i+1])
76+
down++;
77+
if(A[i]<=A[i+1])
78+
up++;
79+
}
80+
if(up==ASize||down==ASize)
81+
return true;
82+
else
83+
return false;
84+
}
85+
86+
/*
87+
另一种方法:
88+
对每一步递增或者递减进行计数(起始值为1),如果是递增序列或者
89+
递减序列,则步数等于元素个数。
90+
*/
91+
92+
bool isMonotonic(int* A, int ASize) {
93+
bool flag = A[0] >= A[ASize-1]? true:false;
94+
if (flag)
95+
{
96+
for ( int i = 0; i < ASize-1; i++ )
97+
{
98+
if (A[i] < A[i+1])
99+
return false;
100+
}
101+
}
102+
else
103+
{
104+
for ( int i = 0; i < ASize-1; i++ )
105+
{
106+
if (A[i] > A[i+1])
107+
return false;
108+
}
109+
}
110+
return true;
111+
}
112+
113+
/*
114+
另一种方法:
115+
对于单调数列,递减的话,最后一个元素一定小于等于第一个元素;
116+
递增的话,最后一个元素一定大于等于第一个元素。
117+
所以可以先比较数组中第一个元素和最后一个元素,将比较结果作为
118+
数组递增或者递减的标志,
119+
在后续的遍历过程中,如果比较结果和之前设定的标志相反,则直接返回false。
120+
*/

0 commit comments

Comments
 (0)