Giả sử bạn đang đứng ở vị trí 0 trên một trục số vô hạn. Bây giờ có một mục tiêu ở vị trí mục tiêu. Ở đây trong mỗi lần di chuyển, bạn có thể đi bên trái hoặc bên phải. Trong lần di chuyển thứ n (bắt đầu từ bước 1), bạn thực hiện n bước. Chúng ta phải tìm số bước tối thiểu cần thiết để đến đích. Vì vậy, nếu đầu vào là target =3, thì chúng ta cần 2 bước. Từ 0 đến 1, từ 1 đến 3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- target:=| target |, cnt:=0
- trong khi mục tiêu> 0,
- giảm cnt đi 1
- target:=target –cnt
- nếu target là chẵn thì trả về cnt, nếu không thì cnt + 1 + cnt mod 2
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h> using namespace std; class Solution { public: int reachNumber(int target) { target = abs(target); int cnt = 0; while(target > 0){ target -= ++cnt; } return target % 2 == 0? cnt : cnt + 1 + cnt % 2; } }; main(){ Solution ob; cout << (ob.reachNumber(3)); }
Đầu vào
3
Đầu ra
2