#include <bits/stdc++.h>
using namespace std;
const int MX = 400010;
struct ST {
  int st[4 * MX], p[MX];
  ST() { build(1, MX - 1, 1); }
  void build(int i, int j, int pos) {
    st[pos] = 0;
    if (i == j) {
      p[i] = pos;
      return;
    }
    int m = (i + j) / 2;
    build(i, m, pos * 2);
    build(m + 1, j, pos * 2 + 1);
  }
  void update(int x, int k) {
    int pos = p[x];
    st[pos] = k;
    pos /= 2;
    while (pos) {
      st[pos] = max(st[pos * 2], st[pos * 2 + 1]);
      pos /= 2;
    }
  }
  int leq(int i, int j, int pos, int x) {
    if (i > x) return 0;
    if (j <= x) return st[pos];
    int m = (i + j) / 2;
    return max(leq(i, m, pos * 2, x), leq(m + 1, j, pos * 2 + 1, x));
  }
  int geq(int i, int j, int pos, int x) {
    if (i >= x) return st[pos];
    if (j < x) return 0;
    int m = (i + j) / 2;
    return max(geq(i, m, pos * 2, x), geq(m + 1, j, pos * 2 + 1, x));
  }
} st;
int n, a[MX], res[MX];
vector<int> c;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    a[i] -= i;
    c.push_back(a[i]);
    c.push_back(a[i] + 1);
  }
  sort(c.begin(), c.end());
  c.erase(unique(c.begin(), c.end()), c.end());
  for (int i = 0; i < n; i++)
    a[i] = lower_bound(c.begin(), c.end(), a[i]) - c.begin() + 1;
  for (int i = 1; i < n; i++) {
    st.update(a[i - 1], 1 + st.leq(1, MX - 1, 1, a[i - 1]));
    res[i] = st.leq(1, MX - 1, 1, a[i - 1]);
  }
  st.build(1, MX - 1, 1);
  for (int i = n - 2; i >= 0; i--) {
    st.update(a[i + 1] + 1, 1 + st.geq(1, MX - 1, 1, a[i + 1] + 1));
    if (i - 1 > 0) res[i] += st.geq(1, MX - 1, 1, a[i - 1]);
  }
  cout << n - 1 - max(*max_element(res, res + n), st.geq(1, MX - 1, 1, 1))
       << '\n';
  return 0;
}
